2015-12-09 23 views
5

Ich habe begonnen, mich auf NPM-Skripte als Hauptwerkzeug für meinen Testprozess zu verlassen.Gibt es eine bessere Möglichkeit, meine NPM-Skripts so zu strukturieren, dass sie besser lesbar sind?

Da ich mehr NPM-Skripte geschrieben habe, sind Reihenfolge und Struktur auf einen Blick immer schwerer zu lesen.

Hier ist, was meine aktuelle Skripte wie folgt aussieht:

{ 
    "scripts": { 
    "clean": "rm -rf report/*", 
    "report": "rm -rf report/; mkdir report", 
    "tests:mocha": "mocha test/spec/", 
    "all-tests:mocha": "npm run tests:mocha -- --recursive", 
    "all-tests:json": "npm run all-tests:mocha -- --reporter json", 
    "all-tests:jsonReport": "npm run all-tests:json > report/all-tests.json", 
    "all-admin:mocha": "mocha test/spec/admin.production.io/", 
    "all-admin-all:mocha": "npm run all-admin:mocha -- --recursive", 
    "all-admin:json": "npm run all-admin:mocha -- --reporter json", 
    "all-admin:jsonReport": "npm run all-admin:json > report/all-tests.json", 
    "google:mocha": "mocha test/spec/googleTest.js", 
    "google:spec": "npm run google:mocha -- --reporter spec --slow 0", 
    "google:json": "npm run google:mocha -- --reporter json", 
    "google:jsonReport": "npm run google:json > report/google-test.json", 
    "usersAll:mocha": "mocha test/spec/admin.production.io/dashboard/users/*.js", 
    "usersAll:spec": "npm run usersAll:mocha -- --reporter spec --slow 0", 
    "usersAll:json": "npm run usersAll:mocha -- --reporter json", 
    "usersAll:jsonReport": "npm run usersAll:jsonReport > report/admin-users-dashboard-all.json", 
    "orgsAll:mocha": "mocha test/spec/admin.production.io/dashboard/organizations/*.js", 
    "orgsAll:spec": "npm run orgsAll:mocha -- --reporter spec --slow 0", 
    "orgsAll:json": "npm run orgsAll:mocha -- --reporter json", 
    "orgsAll:jsonReport": "npm run orgsAll:json > report/admin-orgs-dashboard-all.json", 
    "users-orgs:mocha": "npm run users:spec; npm run orgs:spec", 
    "users-orgs-report": "npm run users:jsonReport; npm run orgs:jsonReport", 
    "pos-users:mocha": "mocha test/spec/admin.production.io/dashboard/users/positiveUserTest.js", 
    "pos-users:spec": "npm run pos-users:mocha -- --reporter spec --slow 0", 
    "pos-users:json": "npm run pos-users:mocha -- --reporter json", 
    "pos-users:jsonReport": "npm run pos-users:json > report/admin-users-dashboard-positive.json", 
    "pos-orgs:mocha": "mocha test/spec/admin.production.io/dashboard/organizations/positiveOrgsTests.js", 
    "pos-orgs:spec": "npm run pos-orgs:mocha -- --reporter spec --slow 0", 
    "pos-orgs:json": "npm run pos-orgs:mocha -- --reporter json", 
    "pos-orgs:jsonReport": "npm run pos-orgs:json > report/admin-users-dashboard-positive.json", 
    "alice-la:mocha": "mocha test/spec/admin.local.us/dashboard/alice/*.js", 
    "alice-la:jsonReport": "npm run alice-la:mocha -- --reporter json -- > report/local-admin-dashboard-alice-all-tests.json", 
    "a2361p-l:mocha": "mocha test/spec/admin.local.us/dashboard/alice/2361-p.js", 
    "a2361p-l:spec": "npm run a2361p-l:mocha -- --reporter spec --slow 0", 
    "a2361p-l:json": "npm run a2361p-l:mocha -- --reporter json", 
    "a2361p-l:jsonReport": "npm run a2361p-l:json > report/a2361p-l.json", 
    "a2361pf-l:mocha": "mocha test/spec/admin.local.us/dashboard/alice/2361-pf.js", 
    "a2361pf-l:spec": "npm run a2361pf-l:mocha -- --reporter spec --slow 0", 
    "a2361pf-l:json": "npm run a2361pf-l:mocha -- --reporter json", 
    "a2361pf-l:jsonReport": "npm run a2361pf-l:json > report/a2361pf-l.json", 
    "alice-pa:mocha": "mocha test/spec/admin.production.io/dashboard/alice/*.js", 
    "alice-pa:jsonReport": "npm run alice-pa:mocha -- --reporter json -- > report/production-admin-dashboard-alice-all-tests.json", 
    "a2361p-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-p.js", 
    "a2361p-p:spec": "npm run a2361p-p:mocha -- --reporter spec --slow 0", 
    "a2361p-p:json": "npm run a2361p-p:mocha -- --reporter json", 
    "a2361p-p:jsonReport": "npm run a2361p-p:json > report/a2361p-p.json", 
    "a2361pf-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-pf.js", 
    "a2361pf-p:spec": "npm run a2361pf-p:mocha -- --reporter spec --slow 0", 
    "a2361pf-p:json": "npm run a2361pf-p:mocha -- --reporter json", 
    "a2361pf-p:jsonReport": "npm run a2361pf-p:json > report/a2361pf-p.json", 
    "a2361:all": "npm run clean; npm run a2361p-l:mocha; npm run a2361p-l:spec; npm run a2361p-l:json; npm run a2361p-l:jsonReport; npm run a2361pf-l:mocha; npm run a2361pf-l:spec; npm run a2361pf-l:json; npm run a2361pf-l:jsonReport; npm run a2361p-p:mocha; npm run a2361p-p:spec; npm run a2361p-p:json; npm run a2361p-p:jsonReport; npm run a2361pf-p:mocha; npm run a2361pf-p:spec; npm run a2361pf-p:json; npm run a2361pf-p:jsonReport", 
    "test": "mocha" 
} 

Dieses nur etwa 8 Tests ist oder so. Ich habe vor, Skripte zu schreiben, um Berichte in Junit-Formaten auszugeben, und es sieht bereits aus wie eine Augenbelastung.

Wie kann ich meine npm-Skripte strukturieren, um besser lesbar zu sein?

+0

Vielleicht ein paar Js-Dateien erstellen Sie können, die jeweils einen kleinen Teil der Tests zu definieren. Dann importiert eine Hauptdatei die anderen, und Sie "kompilieren" dann Ihre package.json mit JSON.Strignify (require ('./main.js')) – Ludo

+0

@Ludo Während das funktionieren würde, scheint es übermäßig exzessiv. Ich denke, es hängt vom Umfang des Projekts ab und davon, wie viele npm-Skripte es brauchen wird. Ich habe einige meiner Skripte überarbeitet und einige unnötige Zeilen reduziert. Ich glaube auch nicht, dass ich geschickt genug bin, um meine package.json mit JS zu erstellen, um es korrekt zu schreiben. – azemPC

+0

Vielleicht könnten Sie Konphyg (https://github.com/pgte/konphyg) verwenden. Es wird ein Konfigurationsobjekt ziemlich einfach erstellen. Dann verwenden Sie fs.writeFileSync ("package.json", JSON.stringify (conphyg.all())), um die Datei package.json zu erstellen. Dieses (https://github.com/exhuma/braindump/tree/master/jsonformat) könnte es verschönern. – Ludo

Antwort

2

bearbeiten: Wählen Sie dies als die beste Antwort für jetzt, bis eine andere Lösung gebucht wird.

Als einen billigen Trick habe ich leere Testskripte als Kopfzeile fungieren dann einfach die richtigen Skripts darunter einrücken. Nicht eine völlig ausreichende Methode, aber es ist besser als gar keine Einrückung.

Warnung: Das Ausführen leerer Skripts führt zu Fehlern.

{ 
    "utils": "", 
     "clean": "rm -rf report/*; rm -rf *.xml", 
     "report": "rm -rf report/; mkdir report", 
    "all-tests": "", 
     "tests:mocha": "mocha test/spec/", 
     "at:mocha": "npm run tests:mocha -- --recursive", 
     "at:junit": "npm run at:mocha -- --reporter mocha-junit-reporter", 
     "at:jReport": "MOCHA_FILE=./report/all-tests.xml npm run at:junit", 
    "all-prod-admin-tests": "",   
     "prod-tests:mocha": "mocha test/spec/admin.production.io/", 
     "apa:mocha": "npm run -prod-tests:mocha -- --recursive", 
     "apa:junit": "npm run apa:mocha -- --reporter mocha-junit-reporter", 
     "apa:jReport": "MOCHA_FILE=./report/all-prod-admin-tests.xml npm run apa:junit", 
    "all-local-admin-tests": "",   
     "local-tests:mocha": "mocha test/spec/admin.pclocal.us/", 
     "ala:mocha": "npm run -prod-tests:mocha -- --recursive", 
     "ala:junit": "npm run ala:mocha -- --reporter mocha-junit-reporter", 
     "ala:jReport": "MOCHA_FILE=./report/all-local-admin-tests.xml npm run ala:junit", 
    "google-example": "", 
     "google:mocha": "mocha test/spec/googleTest.js", 
     "google:spec": "npm run google:mocha -- --reporter spec --slow 0", 
     "google:junit": "npm run google:mocha -- --reporter mocha-junit-reporter", 
     "google:jReport": "MOCHA_FILE=./report/google.xml npm run google:junit", 
    "alice-local-admin-dashboard-tests": "", 
     "alda:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/*.js", 
     "alda:junit": "npm run alda:mocha -- --reporter mocha-junit-reporter", 
     "alda:jReport": "MOCHA_FILE=./report/alice-local-admin-dashboard-tests-all.xml npm run alda:junit", 
     "2361-automated-test": "", 
      "local-admin-pass": "", 
       "a2361p-l:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/2361-p.js", 
       "a2361p-l:spec": "npm run a2361p-l:mocha -- --reporter spec --slow 0", 
       "a2361p-l:junit": "npm run a2361p-l:mocha -- --reporter mocha-junit-reporter", 
       "a2361p-l:jReport": "MOCHA_FILE=./report/2361-local-pass.xml npm run a2361p-l:junit", 
      "local-admin-pass-fail": "", 
       "a2361pf-l:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/2361-pf.js", 
       "a2361pf-l:spec": "npm run a2361pf-l:mocha -- --reporter spec --slow 0", 
       "a2361pf-l:junit": "npm run a2361pf-l:mocha -- --reporter mocha-junit-reporter", 
       "a2361pf-l:jReport": "MOCHA_FILE=./report/2361-local-pass-fail.xml npm run a2361pf-l:junit", 
    "alice-production-admin-dashboard-tests": "", 
     "apda:mocha": "mocha test/spec/admin.production.io/dashboard/alice/*.js", 
     "apda:junit": "npm run apda:mocha -- --reporter mocha-junit-reporter", 
     "apda:jReport": "MOCHA_FILE=./report/alice-production-admin-dashboard-tests-all.xml npm run apda:junit", 
     "2361-automated-test": "", 
      "prod-admin-pass": "", 
       "a2361p-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-p.js", 
       "a2361p-p:spec": "npm run a2361p-p:mocha -- --reporter spec --slow 0", 
       "a2361p-p:junit": "npm run a2361p-p:mocha -- --reporter mocha-junit-reporter", 
       "a2361p-p:jReport": "MOCHA_FILE=./report/2361-prod-pass.xml npm run a2361p-p:junit", 
      "prod-admin-pass-fail": "", 
       "a2361pf-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-pf.js", 
       "a2361pf-p:spec": "npm run a2361pf-p:mocha -- --reporter spec --slow 0", 
       "a2361pf-p:junit": "npm run a2361pf-p:mocha -- --reporter mocha-junit-reporter", 
       "a2361pf-p:jReport": "MOCHA_FILE=./report/2361-prod-pass-fail.xml npm run a2361pf-p:junit", 
    "test": "mocha" 
} 
1

Um die Dateipfade für Mokka-Tests aufzuräumen, man bedenkt, könnte sie zu opts Dateien zu verschieben. So

"alda:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/*.js", könnte sich "alda:mocha": "mocha --opts mocha_opts/alda wo die opts Datei alda Namen enthält:

test/spec/admin.pclocal.us/dashboard/alice/*.js 
--recursive 

Natürlich mocha_opts und opts Dateinamen wäre, was auch immer Sie wollen.

Auch ist -R Abkürzung für --reporter, wenn die

opts Dateien hilft durch Kommandozeilenparameter außer Kraft gesetzt werden, so dass Sie eine Wiederverwendung von ihnen bekommen konnten.

Ich benutze Babel einen Haufen und habe meine DB, Client und API-Server im selben Projekt für jetzt. Die Dinge sind etwas außer Kontrolle geraten. Zusammen mit einigen Shell/Node-Skripten hat mir opts geholfen.

"scripts": { 
    "test": "npm run client:test && npm run api:test", 
    "knex": "babel-node node_modules/.bin/knex --cwd db", 
    "api:test": "mocha --opts api/__dev__/mocha.unit", 
    "api:cover": "api/__dev__/api-cover.sh", 
    "api:tdd": "npm run -s db:cycle && npm run -s api:test -- -w -R min", 
    "api:start": "babel-node api/server", 
    "api:watch": "nodemon --exec npm run -s api:start", 
    "client:test": "mocha --opts client/__dev__/mocha.unit", 
    "client:tdd": "npm run -s client:test -- -w -R min", 
    "client:cover": "client/__dev__/client-cover.sh", 
    "client:build": "babel-node scripts/client-build.js", 
    "client:watch": "npm run -s client:build -- --watch", 
    "db:make": "npm run knex migrate:make", 
    "db:latest": "npm run -s knex migrate:latest", 
    "db:rollback": "npm run -s knex migrate:rollback", 
    "db:cycle": "npm run -s db:rollback && npm run -s db:latest" 
} 
+0

Ich habe ein Problem beim Hinzufügen von Dateipfaden in der mocha.opts-Datei und referenziere sie im npm-Skript. Hier ist, was ich in meine mocha.opts '--alda test/spec/admin.pclocal.us/dashboard/alice/*. Js' geschrieben habe und das npm-Skript wurde in' "alda: mocha" geändert: "mocha - --opts - --alda "'. Ich bekomme einen Fehler, dass Alda eine unbekannte Option ist. Was steht 'mocha_opts/alda' in der Konfigurationsdatei mocha.opts? Darf ich nur mit den hier aufgeführten Optionen arbeiten (https://mochajs.org/#usage)? – azemPC

+0

Ja, das sind die einzigen unterstützten Optionen, die mir bekannt sind. 'mocha_opts /' ist ein Beispielverzeichnis, in dem Sie 'opts' Dateien speichern können. 'alda' ist der Beispieldateiname, den ich angegeben habe. – thebearingedge

+0

Hinzugefügt Beispiel 'opts' zu meiner Antwort – thebearingedge

0

bestätigen wir, dass die JSON-Dateien nicht ein guter Ort sind Aufgaben speichern bauen (keine Kommentare, keine Variablen) und package.json ist schon besonders unübersichtlich.

gulp-shelter könnte ein guter Weg sein, um Ihre Build-Skripte zu rationalisieren, wenn das Lernen von bash and make keine Option für Sie, Ihr Team und externe Mitwirkende ist. Es erlaubt Ihnen, Ihre Build-Aufgaben in einer JS-Datei zu speichern und vereint alle Vorteile von NPM-Skripten und Gulp-Dateien: Prägnanz Lesbarkeit und Wiederverwendbarkeit.

Hier ist, wie es Ihre Aufgaben vereinfachen würde:

const gulp = require('gulp'); 
const shelter = require('gulp-shelter')(gulp); 

const testDir = 'test/spec/'; 

const clean = `rm -rf report/*`; 
const report = `${clean}; mkdir report`; 
const testsMocha = `mocha ${testDir}`; 
const allTestsMocha = `${testsMocha} --recursive`; 
const allTestsJson = `${allTestsMocha} --reporter json`; 
const allTestsJsonReport = `${allTestsJson} > report/all-tests`; 
... 

shelter({ 
    'clean': clean, 
    'report': report, 
    'all-tests:mocha': allTestsMocha, 
    'all-tests:json': allTestsJson, 
    'all-tests:jsonReport': allTestsJsonReport, 
    ... 
}); 
Verwandte Themen