2017-11-22 1 views
8

Wenn ich ein npm-Paket erstelle, würde es manchmal die Notwendigkeit geben, die alte Version des Abhängigkeitspakets zurückzusetzen.Testen Sie zwei verschiedene npm-Paketversionen zur gleichen Zeit

Wenn die neue Version neue api hat, kann ich den Code in diesem Muster schreiben:

import pkg from 'some-pkg'; 
const isNewVersion = pkg.newVersionApi !== 'undefined'; 

if (isNewversion) { 
    pkg.newVersionApi(); 
} else { 
    pkg.oldVersionApi(); // backward compatible api 
} 

Und mit diesem Muster, wenn ich den Test schreiben will, kann ich nur den installed version Code testen. Der Code der anderen Version kann nicht getestet werden.

Als reales Beispiel in React v15 und v16 hat React v16 neue API Portal. Vor der Veröffentlichung von Portal hat v15 unstable_renderSubtreeIntoContainer API, um ähnliche Funktion zu realisieren.

So ist der Code für wie Reagieren wäre:

import ReactDOM from 'react-dom'; 
const isV16 = ReactDOM.createPortal !== 'undefined'; 

if (isV16) { 
    ReactDOM.createPortal(...); 
} else { 
    ReactDOM.unstable_renderSubtreeIntoContainer(...); 
} 

Deshalb möchte ich fragen, ist es eine Methode, mit different dependency version zu testen?

Derzeit denke ich an eine Methode, die andere Version erneut zu installieren und zu testen. Aber es kann nur lokal tun. Es kann nicht auf ci arbeiten und es kann nicht zusammen in der Berichterstattung zählen.

Ich denke, das ist nicht nur für Reaktionstest. Es kann sich im node.js-Test befinden. Jeder Vorschlag kann diskutiert werden.

Aktualisiert vielleicht

Diese Frage bezieht sich two versions dependency in npm zu installieren. Aber ich weiß, derzeit zwei Versionen installieren Abhängigkeit ist nicht praktikabel.

+0

K.I.S.S. Prinzip: Die schnellste (und am wenigsten technische) Lösung besteht darin, zwei separate Kopien Ihrer App zu verwenden, die jeweils die verschiedenen Paketversionen enthalten, die Sie testen möchten. Dies ist mit 'git' trivial, da Sie entweder 1) Ihre App zweimal klonen oder 2) zwei getrennte Zweige verwenden können. –

+0

Das stimmt. Die Verwendung einer separaten Verzweigung ist eine Möglichkeit. Aber wenn dies ein Open-Source- oder ein Co-Working-Projekt ist. Es ist schwierig, das Zusammenführungsproblem zu steuern. Da wir den Mitwirkenden sagen müssen, dass sie der Test-Roadmap folgen sollen, aktualisieren Sie Ihre Änderung auf beiden Seiten und testen Sie sie. –

Antwort

4

Hier ist eine mögliche Lösung, nicht sicher, dass es wie erwartet funktioniert. Aber Sie werden eine Richtung haben, um vorwärts zu gehen.

Paket.json

{ 
    "name": "express-demo", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node ./bin/www" 
    }, 
    "dependencies": { 
    "cookie-parser": "~1.4.3", 
    "debug": "~2.6.3", 
    "express": "~4.15.2", 
    "jade": "~1.11.0", 
    "morgan": "~1.8.1", 
    "serve-favicon": "~2.4.2", 
    "webpack": "^3.8.1", 
    "webpack-dev-middleware": "^1.12.0", 
    "webpack-hot-middleware": "^2.20.0" 
    }, 
    "customDependecies": { 
    "body-parser": [ 
     "", 
     "1.18.1", 
     "1.18.0" 
    ] 
    } 
} 

Hinweis in oben package.json Datei, ich habe einen neuen Schlüssel customDependecies hinzugefügt, die ich für die Installation mehrerer Abhängigkeiten verwenden. Hier verwende ich body-parser Paket für die Demo. Als nächstes brauchen Sie eine Datei, die diese key lesen und die Deps installieren kann.

install-deps.js

const {spawnSync} = require('child_process'); 
const fs = require('fs'); 

const customDependencies = require('./package.json').customDependecies; 

spawnSync('mkdir', ['./node_modules/.tmp']); 

for (var dependency in customDependencies) { 
    customDependencies[dependency].forEach((version) => { 
    console.log(`Installing ${dependency}@${version}`); 
    if (version) { 
     spawnSync('npm', ['install', `${dependency}@${version}`]); 
     spawnSync('mv', [`./node_modules/${dependency}`, `./node_modules/.tmp/${dependency}@${version}`]); 
    } else { 
     spawnSync('npm', ['install', `${dependency}`]); 
     spawnSync('mv', [`./node_modules/${dependency}`, `./node_modules/.tmp/${dependency}`]); 
    } 
    }); 

    customDependencies[dependency].forEach((version) => { 
    console.log(`Moving ${dependency}@${version}`); 
    if (version) { 
     spawnSync('mv', [`./node_modules/.tmp/${dependency}@${version}`, `./node_modules/${dependency}@${version}`]); 
    } else { 
     spawnSync('mv', [`./node_modules/.tmp/${dependency}`, `./node_modules/${dependency}`]); 
    } 
    }); 
} 
spawnSync('rm', ['-rf', './node_modules/.tmp']); 
console.log(`Installing Deps finished.`); 

Hier bin ich deps eins nach dem anderen in tmp Ordner und einmal installiert installieren, ich sie ./node_modules Ordner bewege.

Sobald alles installiert ist, können Sie die Versionen wie unten

index.js

var bodyParser = require('body-parser/package.json'); 
var bodyParser1181 = require('[email protected]/package.json'); 
var bodyParser1182 = require('[email protected]/package.json'); 

console.log(bodyParser.version); 
console.log(bodyParser1181.version); 
console.log(bodyParser1182.version); 

Hoffnung prüfen, wird dies Ihren Zweck dienen.

+0

Cool! Es scheint eleganter zu sein, das Testproblem zu lösen. Haben Sie eine Idee, die Berichterstattung zusammen zu zählen? –

+0

Ich bin mir nicht sicher, was meinst du mit "Zähle die Berichterstattung zusammen?" –

+0

Da die Testabdeckung basierend auf einem Testprozess gezählt wird, und wenn ich diesen Weg zur Strukturierung des Projekts verwende, muss ich den Testprozess bei jeder anderen Version ausführen, die Abdeckung kann nicht zusammen integriert werden (zB: v1 test + v2 test ...). –

0

erstellen 3 separate Projekte (Ordner mit package.json) und einem freigegebenen Ordner:

  1. Ein gemeinsamer Ordner mit dem Testmodul (my-test) enthält. Exportieren Sie eine Funktion, um den Test auszuführen.
  2. Ein Client-Projekt importiert my-test und Abhängigkeit v1. Exportieren Sie eine Funktion, die die Testfunktion in my-test aufruft.
  3. Ein Client-Projekt importiert my-test und Abhängigkeit v2. Exportieren Sie eine Funktion, die die Testfunktion in my-test aufruft.
  4. Ein Masterprojekt, das beide Clientprojekte importiert. Führen Sie jede exportierte Funktion aus.
0

Sie müssen sie separat ausführen. Erstellen Sie einen separaten Projektordner für jede Abhängigkeitsversion. Ex. Reagieren10, Reagieren11, Reagieren12. Jeder hat sein eigenes package.json, spezifiziert für die korrekte Version. Wenn Sie die Tests integration und/oder versioned ausführen, führen Sie die standardmäßigen Komponententests für jede Version durch. Es kann jedoch auch ratsam sein, diesem Ordner versionsspezifische Komponententests hinzuzufügen.

Das Erstellen einer make Datei würde Ihr Leben einfacher machen, wenn Sie Ihre vollständige Testsuite ausführen. Wenn Sie dies tun, können Sie dies leicht in CI integrieren.

+0

Dies ist eine praktikable Lösung. Aber weil nur ein bisschen anders von API ändern, kann ich einige Code in anderer Version duplizieren. Außerdem kann die Codeabdeckung nicht zusammen gezählt werden. –

+0

Welchen Code würden Sie duplizieren? Sie sollten für jede Version dieselben Komponententests ausführen. Die Idee für das Hinzufügen zusätzlicher Tests pro Version wäre es, sie zu entfernen, wenn eine Version nicht mehr unterstützt wird, und es Ihnen zu ermöglichen, etwas zu testen, das nur für diese Version auftritt. – Seth

Verwandte Themen