Successfully reported this slideshow.

Node.js moduly a testovanie

943 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Node.js moduly a testovanie

  1. 1. Node.js Moduly@sotosof @danielharcek
  2. 2. ObsahKto smeModulyNPMPackage.jsonStrukturaExports / RequireProcess.NextTickVela o testovani :)
  3. 3. Kto smeOnline marketingRobili sme:● M 2 N affiliate platformu● campaign management and reporting● tag management● campaign attribution / selective cookie call● ad server with different targeting models including behavioral targetingTeraz robime @novosense:● Persistent user tracking platformu● Cloud cookie● Realtime activity maps & user engagement
  4. 4. Technologicky stackServer:● Node.js (predtym nativne Apache moduly)● PythonData:● Cassandra● Redis● CouchbaseKomunikacia:● RabbitMQa samozrejme aj PHP a MySQL ;)
  5. 5. ModulyJasna vec deporkifikacia kodu / DRY, znovupouzitelnost, izolacia kodua decoupling, vyssia kombinovatelnostDruhy modulov v Node.js*:● c/c++ binding● kniznica● command line program● server / website (nie framework - uz kompletna implementacia)Nevynaliezajte "koleso":● https://github.com/joyent/node/wiki/Modules kategorizovany zoznam● http://search.npmjs.org/ a http://toolbox.no.de/ vyhladavace* Podla http://howtonode.org/how-to-module
  6. 6. Balicky (CommonJS 1.0)npm [http://npmjs.org/doc/]● kto "Noduje" tak sa s nim stretol● od Node.js v0.6+ bundlovany s Node● CLI sprava a distribucia balickov● popisuje interface k balickom prostrednictvom package.json suboru v roote projektuCo je balicek (a formy distribucie pre npm install)● adresar obsahujuci program popisany package.json● tar.gz obsahujuci package.json alebo URL na tar.gz● meno / meno@verzia / meno@tag publishnuty v NPM registri● GIT repository obsahujuce package.jsonPrivatny NPM register? Da sa http://npmjs.org/doc/registry.html
  7. 7. Struktura balicku (layout podla CommonJS)/bin spustitelne subory/doc/example/lib tu prebyva nas modul / javascript kod/test.npmignore funguje ako .gitignoreindex.js automaticky berie ako main include pre adresarpackage.jsonREADME.md slusnost kaze zvlast ak chceme npm publish
  8. 8. package.json [http://npmjs.org/doc/json.html]npm init je carovny :) a interaktivnyAbout to write to /Users/daniel/Desktop/todo/rubyslava/package.json{ "author": "kolektiv autorov :)", "name": "simple_remote_logger", "description": "Intended to be used as remote javascript console.", "version": "0.0.1", "main": "./index", "scripts": { "test": "mocha test/*.js" }, "engines": { "node": "~0.6.7" }, ...
  9. 9. package.json rucne upravySemantic version ranges http://npmjs.org/doc/json.html#dependenciespodla potreby doplnime zavislosti "dependencies" : { "commander" : "=0.6.x" // doporucuje sa }vyvojove zavislosti test fw, docu fw... "devDependencies" : { "mocha" : "" // matches any version }ak ideme npm publish pridame keywords"keywords" : ["remote", "console"]
  10. 10. package.json goodies● "files" pole definijuce subory / adresare ktore ma projekt obsahovat, toto je lepsie riesit asi cez .npmignore● "bin" kolekcia spustitelnych suborov ktore sa maju nainstalovat do PATH● "scripts" script commandy spustitelne v roznych fazach zivotneho cyklu balicka● "config" konfiguracne parametre pre scripty● "publishConfig": {"registry": URL } prikaze publikovat do definovaneho registra● "private" true / false povoluje alebo zamedzuje publikovanie balicka vo vseobecnosti
  11. 11. module.exportsLokalne premenne modulu su privatne. Nedeklarujeme NIC bez var lebozmrsime global scope. Ako rozhranie modulu sluzi module.exports. Je toobjekt (kolekcia) zdielany medzi vsetkymi "instanciami" modulu.var default_name = John;var say_hello = function(name) { console.log(Hello +(name ? name : default_name) + !); };module.exports.def_name = default_name;module.exports.say = say_hello;Priradit mu ale mozeme aj akykolvek platny Javascript typ (boolean, number,date, string, function, array, object etc.)var Server = function(resource_path) { ... }module.exports = Server;
  12. 12. exports vs. module.exportsexports nepouzivat !!!, je to vlastne "alias" vytvoreny kmodule.exports. Module system za nas urobivar exports = module.exports;Pokial pridavame properties tak je to ok. Akonahle alechceme priradit nieco "by assignment" tak vlastne lenprepiseme referenciu na module.exports a modulexportuje prazdny objekt.exports = jezisko; // jezisko von nepridezauzivane je exports = module.exports = ...
  13. 13. require()Nacita modul a vrati jeho exports. Moduly su cachovanepo prvom nacitani, takze kazdy call require(moj_modul) vrati ten isty objekt (vynimka moze bytak exportujeme "by assignment" - tam zalezi od toho copriradime priamo do module.exports).var greeting = require(./say_hello);var def_name = require(./say_hello).def_name; // priamerequire konkretnej property exportu modulu je moznegreeting.say();$ node main.jsHello John!
  14. 14. require()Tri sposoby pouzivania require● var foo = require(./lib/foo) relativna cesta● var foo = require(/home/foo/lib/foo) absolutna cesta● var foo = require(foo) searchPri loadovani modulov idealne pouzivat search - drzat sapravidla ze vsetky dependencies by mali byt instalovanelokalne (voci danemu modulu).Require cohokolvek v ramci modulu (okrem modulov)relativne.http://npmjs.org/doc/faq.html#Why-can-t-npm-just-put-everything-in-one-place-like-other-package-managers
  15. 15. Process.NextTickSluzi na odlozenie vykonania ulohy, callbacku do dalsiehocyklu event loopu (narocne CPU tasky je ale idealneoddelit do zvlast procesu - s nimi mozeme komunikovattiez cez eventy, eventualne pouzit WebWorkers). Takneblokuje vykonavany kod a je vykonany skutocneasynchronne.var net = require(net);var client = net.connect(8124, function() { //connectlistener console.log(client connected); client.write(world!rn);});
  16. 16. npm workflownpm addusernpm initnpm publish // v roote modulunpm unpublish name
  17. 17. npm fintickynpm link / npm unlink (alebo vymazat symlink)Ak mame modul ktory je vyvoji a nie je publishnuty tak jednoduchsie ako hostale instalovat je pouzit npm link. To vytvori symlink v global mode. Potomho mozeme linkovat kde potrebujeme / odkazovat nan v dependencies.npm rootpodla adresara v ktorom sa nachadzame nam vypise kde idu modulynpm packz hocicoho instalovatelneho vytvori tarballnpm prunevycisti node_modules od balikov ktore nie su v dependencies
  18. 18. TestovanieZnova jasna vec● odhalovanie chyb● chyby po update● opatovne zanesenie chyb● test funkcionality robi to to co ma?● automatizacia nech na to mysli stroj a nie jaNajbeznejsie sa stretavame s● unit testmi funkcie, subrutiny, metody● funkcnymi testmi cely program s roznymi vstupmi
  19. 19. Testy? Bitch please... "Test je prvy pouzivatel tvojho kodu."Zakladne pravidla testov● F ako Fast Preco hrate CS? Lebo bezia testy :).● I ako Isolated Test ma testovat iba jedno spravanie a ma byt izolovany.● R ako Repeatable Musi vratit vzdy rovnake vysledky.● S ako Self-Verifying Ma zlyhat koli jednoznacnemu dovodu.● T ako Timely Testy sa pisu predtym ako je hotovy produkcny kod. pisanie Test-After Development je evil
  20. 20. Ako ich pisat v JavascripteNetestovat privatne metodyassertEqual(val, component._pseudoPrivateFunc());Netestovat privatny statusassertEqual(val, component._pseudoPrivateAttribute);Netestovat privatne zavislostivar obj = new FooComponent();var spy = sinon.spy(obj.dependency._pseudoPrivateFunc);obj.doSomething();assertTrue(spy.called);
  21. 21. Ako ich pisat v Javascripte contd.Netestovat viacere operacie v jednom testeobj.doSomething();this.assertEqual(expected, obj.attr);obj.doSomethingElse();this.assertEqual(different, obj.attr);Mocknut vsetky zavislostivar dep = sinon.mock({mockedFunc: function() {returntrue;}});objToTest.setDep(dep);Testovat spravanie public interface objektu
  22. 22. Test styles TDD (xUnit)buster.testCase("My thing", { "foo": function () { assert.equals(foo, "bar"); }, "state": function () { assert(true); }})my sme zvyknuti na xUnit
  23. 23. Test styles BDDdescribe("My thing", function () { it("equals of foo and bar failes", function () { expect("foo").toEqual("bar"); }); it("states the obvious", function () { expect(true).toBe(true); });});
  24. 24. Test styles qUnittest("a basic test example", function() { ok(true, "this test is fine"); var value = "hello"; equals("hello", value, "We expect value to be hello");});module("Module A");test("first test within module", 1, function() { ok(true, "all pass");});
  25. 25. Test runnersJe ich vela, "uceleny" framework existuje v beta verzii.Najznamejsie● mocha● buster● vows● zombie.js● jsTestDriverZacali sme s mocha lebo ma runner pre kazdy styl, velareporterov (pristavanie lietadla), code coverage report,nezavislost od assertovacej libky. Nema assertation count:(
  26. 26. AssertationsO tomto je testovanie.Najznamejsie● chai.js● should.jsIdealny stav je jeden assert v teste (I ako Isolated). Nievzdy to musi byt pravidlo.Message ma pomoct pri pochopeni assertu.
  27. 27. Spy, Stub and Mock● simulovanie zavislosti● overovanie volani● predprogramovane ocakavaniaAle nie privatnych!Ak to test vyzaduje moze to znamenat ze objekt je moczlozity. Treba porozmyslat nad rozdelenim logiky doviacerych objektov (zavislosti), ktore uz ide mocknutlahko.
  28. 28. Buster"Uceleny" framework v pouzitelnej verzii.Spaja vsetky skvele funkcie ostatnych runnerov dojedneho.● testovanie v node aj v browseroch (aj vo viacerych naraz)● assertations and refutes (minitest v ruby)● obsahuje sinon.js a podporuje definiciu vlastnych asertacii● moznost automatizacie● ...● bude aj podpora BrowserStack
  29. 29. Testy moduluNejake zdrojaky.
  30. 30. MakefileKamarat automatizaciemake testmake test-xmla npmnpm test

×