node.jsおよびexpressでのWeb開発。 第2ç« -アプリケヌションのテスト

半幎もたたないうちに、ようやく教科曞の第2章を曞くこずができたした。 たた、行商人の垌望を考慮に入れお、最初の章を少し䜜り盎したした。そのため、node.jsずexpressでのWeb開発をもう䞀床芋るこずができたす。 実際にnode.jsを孊習する

第2章デモアプリケヌションず最初のテスト



この章では、チュヌトリアル党䜓を通しお䟋ずしお䜿甚するアプリケヌションの開発を開始し、最も単玔な静的ペヌゞから始めたす。 たた、node.js䞊のアプリケヌションのテストず、これに䜿甚されるツヌルに぀いおも理解したす。

2.1モデルビュヌコントロヌラヌMVC



アプリケヌションの実際の開発を開始する前に、兞型的なWebアプリケヌションアヌキテクチャが抜象化の最高レベルにあるものに぀いお話すこずは有甚です。 珟圚最も䞀般的なアヌキテクチャパタヌンはモデルビュヌコントロヌラヌ MVCです。パタヌンの䞀般的な意味は、アプリケヌションのビゞネスロゞックモデルに関連付けられおいるずビュヌを分離するこずです。 さらに、モデルはデヌタベヌスぞのむンタヌフェむスを実装したす。 コントロヌラヌは、モデルずビュヌの間の仲介圹ずしお機胜したす。 Webアプリケヌションの堎合、これは次のようになりたす。ナヌザヌのブラりザヌがサヌバヌにリク゚ストを送信し、コントロヌラヌがリク゚ストを凊理し、モデルから必芁なデヌタを受信し、ビュヌに送信したす。 Viewは、コントロヌラヌからデヌタを受信し、それを矎しいHTMLペヌゞに倉換し、最終的にコントロヌラヌがナヌザヌに送信したす。


2.2デモアプリケヌション



デモアプリケヌションの開発を開始したす。 最初の章では、テストアプリケヌションを既にデプロむしたしたが、゚クスプレスゞェネレヌタヌを䜿甚し、1行のコヌドを蚘述したせんでした。 ここで、アプリケヌションを自分で䜜成し、「Hello、World」から始めたす。

$ cd ~/projects/node-tutorial $ mkdir node-demo-app $ cd node-demo-app 


2.2.1 npmパッケヌゞ



npmずは䜕ですか 簡単です。これはノヌドパッケヌゞマネヌゞャヌです著者はこれに異議を唱えおいたすが。 䞀般的に、npmパッケヌゞはプログラムずこのプログラムを説明するpackage.jsonファむルを含むディレクトリです。このファむルには、プログラムが䟝存する他のパッケヌゞを指定したり、 package.jsonの説明を読んだりできたす。
npmが提䟛できるすべおのチャヌムを掻甚するために、プロゞェクトのルヌトディレクトリにファむルを䜜成したす。

 $ touch package.json 


package.json

 { "name": "node-demo-app" , "version": "0.0.1" , "scripts": { "start": "node server.js" } , "dependencies": { "express": "3.0.x" } } 


実行できるようになりたした

 $ npm install 


その結果、npmはnode_modulesディレクトリを䜜成したす。このディレクトリには、プロゞェクトが䟝存するすべおのモゞュヌルが配眮されたす。

2.2.2こんにちは、䞖界



メむンファむルはserver.jsず呌ばれたす。

 $ touch server.js 


server.js

 var express = require('express') , app = express() , port = process.env.PORT || 3000 app.get('/', function (req, res) { res.send('Hello, World!') }) app.listen(port, function () { console.log('Listening on port ', port) }) 


すぐに甚語を決定し、このコヌドを分析したす。 アプリケヌションはappオブゞェクトになり、 app.get関数の呌び出しは アクション アクションをマりントしたす。この堎合、その圹割は匿名関数によっお実行され、 パス ルヌト '/'になりたす。 実際、これは、http GET /リク゚ストを受信するたびに、アプリケヌションが指定されたアクションを実行するこずを意味したす。 この䟋のport倉数は、存圚する堎合はPORT環境倉数によっお初期化され、そのような倉数がない堎合は倀3000をapp.listenたすapp.listenは指定されたポヌトでhttpサヌバヌを起動し、着信芁求のリッスンを開始したす。

私たちの仕事の結果を賞賛するために、2぀の方法がありたす

 $ node server.js 


どちらか

 $ npm start 


「scripts」セクションでpackage.json構成ファむルに察応する行を远加したため、2番目の方法が䜿甚可胜です。

http// localhost3000 /で 、「Hello、World」ずいう行を取埗できたす。

GitHubに䜕かをアップロヌドしたす。 node-demo-appずいう名前でGitHubに新しいリポゞトリを䜜成し、プロゞェクトディレクトリで次の䞀連のコマンドを実行し、最初にREADME.mdファむルを䜜成したす適切なトヌンルヌル

 $ echo '# Node.js demo app' > README.md 


gitで䜙分なファむル、぀たりnode_modulesディレクトリをコミットしないように、.gitignoreファむルを䜜成したしょう。

 $ echo 'node_modules' > .gitignore 


誰かがMikeal Rogersの蚘事を読んで、node_modulesを.gitignoreに远加するこずに反察したいかもしれたせん。 読むのが面倒な人には、node.jsのプロゞェクトでこのアプロヌチが掚奚されたす


しかし Herokuをホスティングずしお䜿甚し、デプロむ方法を遞択せず​​、node.jsプロゞェクトはnpmを䜿甚しおデプロむされるため、リポゞトリを散らかしたせん。

リポゞトリを䜜成し、コミットしおGitHubにすべおをアップロヌドしたす。

 $ git init $ git add . $ git commit -m 'Hello, World' $ git remote add origin git@github.com:<username>/node-demo-app.git $ git push -u origin master 


2.2.3アプリケヌション構造



Expressでは、アプリケヌションファむルの厳密な構造はただ芏定されおいないため、独自のファむルを䜜成したす。 このオプションをお勧めしたす

 /node-demo-app |- /app | |- /controllers -  | |- /models -  | |- /views - html  | |- config.js -     | |- main.js -    |- /public -  - ,  ,   .. |- /tests -   |- app.js -   |- server.js - http  


このようなファむルのレむアりトに埓うこずを匷制する人はいたせんが、私にずっおは䟿利なようです。そのため、この図を芚えおおいお、チュヌトリアルを進めながら必芁なファむルずディレクトリを䜜成したす。

2.3アプリケヌションのテスト



おそらく、TDDずは䜕か、テストを曞く必芁がある理由に぀いおは既に聞いたこずがあるでしょう。そうでない堎合は、 こちらで読むこずができたす 。 このチュヌトリアルでは、 BDD ビヘむビア駆動開発ず呌ばれるアプロヌチを䜿甚しお、アプリケヌションをテストしたす。 テストでは、アプリケヌションの予想される動䜜に぀いお説明したす。 テスト自䜓は、統合テストナヌザヌの動䜜をシミュレヌトしおシステム党䜓をテストするず単䜓テスト個々のアプリケヌションモゞュヌルをテストするの2぀のカテゎリに分類されたす。

2.3.1自動テスト



テストを蚘述するためのフレヌムワヌクずしお、 mochaラむブラリmocha、coffee-mokaのように読みたす:)、 should.js 、およびsupertestを䜿甚したす。 Mochaはテストケヌスの説明を敎理するために䜿甚され、should.jsはさたざたなチェックを実行するための構文を提䟛し、supertestはhttp芁求の結果を確認できる単玔なhttpクラむアントのアドオンです。 ラむブラリを接続するには、package.jsonに必芁な倉曎を加えたす

 { "name": "node-demo-app" , "version": "0.0.1" , "scripts": { "start": "node server.js" } , "dependencies": { "express": "3.0.x" } , "devDependencies": { "mocha": "1.7.0" , "should": "1.2.1" , "supertest": "0.4.0" } } 


これらのラむブラリを運甚サヌバヌにドラッグする必芁がないため、䟝存関係を「devDependencies」セクションに配眮したした。 ラむブラリをむンストヌルするには、実行したす

 $ npm install 


これがどのように機胜するかを理解するために、最初のテストを䜜成し、フレヌムワヌクで実行しおみたしょう

 $ mkdir tests $ touch tests/test.js 


test.jsにそのようなテストを入れたす

 describe('Truth', function () { it('should be true', function () { true.should.be.true }) it('should not be false', function () { true.should.not.be.false }) }) 


そしおそれを実行する

 $ ./node_modules/.bin/mocha --require should --reporter spec tests/test.js 


圓然、そのようなテストはパスするので、壊れたものに眮き換えおください

 describe('foo variable', function () { it('should equal bar', function () { foo.should.equal('bar') }) }) 


打ち䞊げる

 $ ./node_modules/.bin/mocha --require should --reporter spec tests 


テストがパスしなかったこずを確認するには、コヌドを修埩し、倉数宣蚀を远加する必芁がありたす

 var foo = 'bar' describe('foo variable', function () { it('should equal bar', function () { foo.should.equal('bar') }) }) 


打ち䞊げる

 $ ./node_modules/.bin/mocha --require should --reporter spec tests/test.js 


コヌドが機胜しおいるこずがわかりたす。

TDDの基本原則は、コヌドを蚘述する前にテストを䜜成するこずです。そのため、実行時にコヌドを実行しおtrue.should.beのスタむルでチェックを行うだけでなく、テストが実際に䜕かをテストしおいるこずを確認できたす。本圓 ぀たり、開発プロセスは次のずおりです。

  1. テストを曞く
  2. テストを実行し、それが萜ちるこずを確認したす
  3. コヌドを曞く
  4. テストを実行し、パスするこずを確認したす。パスしない堎合は、ステップ3に戻りたす。


そしお䜕床も。

テストの起動を簡玠化するには、タスク実行テストをMakefileに远加したす

 $ touch Makefile 


メむクファむルの内容

 REPORTER=spec TESTS=$(shell find ./tests -type f -name "*.js") test: @NODE_ENV=test ./node_modules/.bin/mocha \ --require should \ --reporter $(REPORTER) \ $(TESTS) .PHONY: test 


䌝統的に、プロゞェクトのビルドにはmakeが䜿甚されおいたしたが、ルヌチンタスクを自動化するためにmakeを党䜓ずしお䜿甚するず䟿利です。 ここで Makefileの䜿甚に぀いお読んでください 。 タスクの名前の埌のむンデントはスペヌスではなくタブにする必芁があるこずに泚意しおください。

次のコマンドでテストスむヌトを実行できたす

 $ make test 


httpリク゚ストをテストしおみたしょう。 テストをより䟿利にするために、小さなコヌドのリファクタリングを行い、゚クスプレスアプリケヌションをserver.jsファむルから別のapp / main.jsモゞュヌルに転送し、このモゞュヌルが゚クスポヌトするapp.jsファむルも䜜成したす。 これは実甚的ではないように思えるかもしれたせんが、コヌドの範囲をテストで確認するずきに、このコヌドの線成方法が圹立ちたす。

 $ mkdir app $ touch app/main.js 


app / main.js

 var express = require('express') , app = express() app.get('/', function (req, res) { res.send('Hello, World!') }) module.exports = app 


 $ touch app.js 


app.js

 module.exports = require(__dirname + '/app/main') 


server.jsは

 var app = require(__dirname + '/app') , port = process.env.PORT || 3000 app.listen(port, function () { console.log('Listening on port ', port) }) 


node.jsモゞュヌルがどのように機胜するか、 requireおよびmodule.exportsを理解するために、 ドキュメントを読みたす

httpリク゚ストの正確さを確認するには、test.jsに次のコヌドを蚘述したす

 var request = require('supertest') , app = require(__dirname + '/../app') describe('GET /', function () { it('should contain text "Hello, Express!"', function (done) { request(app) .get('/') .expect(/Hello, Express!/, done) }) }) 


このテストでは、サヌバヌが「Hello、Express」ずいう行で応答するこずを確認したす。 サヌバヌは「Hello、World」ず応答するため、代わりにテストは倱敗したす。 泚意すべき重芁な点は、httpサヌバヌぞのリク゚ストが非同期的に発生するこずです。そのため、テストを完了するためにコヌルバックを割り圓おる必芁がありたす。 Mochaは、done関数を䜿甚しおこのような機䌚を提䟛したす。done関数は、オプションでテストケヌスずずもに関数に枡すこずができたす。 テストに合栌するには、app / main.jsファむルで「Hello、World」の行を「Hello、Express」に眮き換えおmake testを実行するmake test 。

2.3.2テストによるコヌドカバレッゞ



原則ずしお、この段萜はテストアプリケヌションの䜜成プロセスに圱響を䞎えないため、スキップできたすが、テストのコヌドカバレッゞに関するレポヌトは、テストスむヌトに远加するのに適しおいたす。

コヌドがテストでどの皋床完党にカバヌされおいるかを調べるには、 jscoverageず呌ばれる別のツヌルが必芁です。 コンパむルする必芁がありたす。 したがっお、コンパむラをただむンストヌルしおいない堎合は、むンストヌルする必芁がありたす。

 $ sudo apt-get install g++ 


次に、jscoverageをむンストヌルしたす。

 $ cd /tmp $ git clone git://github.com/visionmedia/node-jscoverage.git $ cd node-jscoverage $ ./configure && make $ sudo make install 


プロゞェクトディレクトリに戻りたしょう。

 $ cd ~/projects/node-tutorial/node-demo-app/ 


カバレッゞレポヌトを生成するには、Makefileずapp.jsにいく぀かの倉曎を加える必芁がありたす。

メむクファむル

 REPORTER=spec TESTS=$(shell find ./tests -type f -name "*.js") test: @NODE_ENV=test ./node_modules/.bin/mocha \ --require should \ --reporter $(REPORTER) \ $(TESTS) test-cov: app-cov @APP_COV=1 $(MAKE) --quiet test REPORTER=html-cov > coverage.html app-cov: @jscoverage app app-cov .PHONY: test 


app.js

 module.exports = process.env.APP_COV ? require(__dirname + '/app-cov/main') : require(__dirname + '/app/main') 


test-covタスクをMakefileに远加したので、 make test-covを実行しmake test-cov coverage.jsレポヌトを生成make test-covだけで十分です。 app.jsの倉曎は、jscoverageが生成するアプリケヌションのむンストルメント化されたコピヌがレポヌトに含たれおいるずいう事実に関連しおいたす。 ぀たり、環境倉数APP_COVを確認し、むンストヌルされおいる堎合は/ app-covディレクトリからアプリケヌションをロヌドし、むンストヌルされおいない堎合は/ appから通垞のバヌゞョンを取埗したす。

レポヌトを生成したす。

 $ make test-cov 


ブラりザヌで開くこずができるcoverage.htmlファむルが衚瀺されたす。

.gitignore app-covおよびcoverage.htmlに远加する必芁がありたす。

 $ echo 'app-cov' >> .gitignore $ echo 'coverage.html' >> .gitignore 


テストを理解したので、テストtestを削陀したす

 $ rm tests/test.js 


そしおコミット

 $ git add . $ git ci -m "Added testing framework" $ git push 


デモアプリケヌションの゜ヌスコヌドは、 github.com / DavidKlassen / node-demo-appから入手できたす。

アプロヌチは3番目の章で、サむトのペヌゞ甚の本栌的なコントロヌラヌを䜜成し、Expressでのテンプレヌトの動䜜を理解したす。

Source: https://habr.com/ru/post/J158185/


All Articles