GAミント至上主義

Web Monomaniacal Developer.

mochaとsupertestを使ってexpressとHeadless Chromeを使ったアプリのテストを書く

Headless Chrome(以下HC)を使ったPDFサーバーのテストを書いた。

github.com


HCが別プロセスのため非同期処理などではまり面倒だったため、外からHTTPリクエストを投げるテストにした。結合テスト
だいぶ雑だけど今まで手でたたいていたのに比べれば効率化できたともう。
GitHub - visionmedia/supertest: Super-agent driven library for testing node.js HTTP servers using a fluent API

supertestとmochaを使う。

npm install mocha supertest

package.json

//省略
  "dependencies": {
    "body-parser": "^1.18.3",
    "connect-timeout": "^1.9.0",
    "debug": "^3.1.0",
    "express": "^4.16.3",
    "mocha": "^5.2.0",
    "morgan": "^1.9.0",
    "npm": "^6.4.0",
    "puppeteer": "^1.7.0",
    "supertest": "^3.1.0"
  },
//省略

supertestをrequireした関数request にexpressのappを渡してもいいけど、URLを渡せばリクエストを投げて、ステータスコードとか各種ヘッダーなどのレスポンスをexpectできる。

test/requests.js

const request = require('supertest')
const SERVER_URL = process.env.HCEP_TEST_SERVER_URL || 'http://localhost:8000'
const TAREGT_URL = process.env.HCEP_TEST_TAREGT_URL ||'https://www.google.com'
const HTML_TEST_STRINGS = '<html>ok</html>'
console.log('SERVER_URL:', SERVER_URL)
console.log('TAREGT_URL:', TAREGT_URL)

describe('requests routes', (done) => {
  req = request(SERVER_URL);
  it('Health Check GET /hc', async () => {
    await req.get('/hc')
      .expect(200, 'ok', done)
  })
  it('GET / with no url', async () => {
    await req.get('/')
      .expect(400, 'get parameter "url" is not set', done)
  })
  it('GET / with url ' + TAREGT_URL, async () => {
    await req.get('/?url=' + TAREGT_URL)
      .expect('Content-Type', 'application/pdf')
      .expect(200, done)
  })
  it('POST / html=' + HTML_TEST_STRINGS, async () => {
    await req.post('/')
      .send('html=' + encodeURI(HTML_TEST_STRINGS))
      .expect('Content-Type', 'application/pdf')
      .expect(200, done)
  })
  it('GET /screenshot with url ' + TAREGT_URL, async () => {
    await req.get('/screenshot?url=' + TAREGT_URL)
      .expect('Content-Type', 'image/png')
      .expect(200, done)
  })
  it('POST /screenshot html='+ HTML_TEST_STRINGS, async () => {
    await req.post('/screenshot')
      .send('html=' + encodeURI(HTML_TEST_STRINGS))
      .expect('Content-Type', 'image/png')
      .expect(200, done)
  })
})

変換サーバーという都合上、レスポンスボディの多くはPDF、PNGなどのバイナリなので文字列チェックは行えず、とりえあず面倒なのでcontent typeだけ見てる。

今後出力サイズの変更機能をテストしたくなったらPDFを読むライブラリなどを使わなければいけないだろうか。

テストの仕方は、まずhcep-pdf-serverのDockerを起動した状態で
execで直接叩くか、

sudo docker exec {container id} mocha

一度bashで入ってから叩くのもできる

sudo docker ecec -it {container id} bash

Nodeクックブック

Nodeクックブック