통합 테스트로 보안 엔드포인트 테스트

4350 단어 javascriptnodetesting
API 테스트는 성공적인 API를 위한 비기능적 요구사항이며 완료 정의의 일부입니다. API 보안도 비기능적 요구 사항입니다.

세션 기반 보안 쿠키를 사용하는 보안 엔드포인트에서 통합 테스트를 생성하는 것은 어려울 수 있습니다! 이 게시물은 세션 기반 쿠키로 보호되는 동안에도 이러한 통합 테스트를 생성하기 위해 취한 접근 방식을 단계별로 설명합니다.

Integration Tests are test that verify a collection of components properly work together to perform a process. A common integration test is from the API Endpoint to the Service Layer.





다음은 서버 설정입니다.

서버.js

const express = require('express')
const session = require('express-session')
const app = express()
const auth = require('./middleware/auth')

app.use(session({
  secret: 'jack russell',
  resave: false,
  saveUinitialized: true,
  cookie: { secure: true }
}))

app.use(auth.check)

app.post('/login', (req, res) => {
  req.session.user = { name: req.query.name }
  res.status(201).json({ ok: true })
})

app.get('/movies', (req, res) => {
  res.status(200).json(['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])
})

app.get('/logout', (req, res) => {
  res.session.user = null
  res.json({ ok: true })
})

if (!module.parent) {
  app.listen(3000)
}

module.exports = app


미들웨어/auth.js

exports.check = function (req, res, next) {
  if (req.path !== '/login' && req.session.user) {
    next()
  } else {
    res.status(401).json({ message: 'not authorized' })
  }
}


따라서 영화 목록을 반환하는 매우 간단한 API가 있지만 영화 목록을 가져오려면 API에 로그인해야 합니다.

테스트를 작성해보자!

테스트/movies.js

const test = require('tape')
const testServer = require('@twilson63/test-server')
const fetch = require('node-fetch')

const app = require('../server')

test('List Movies', async (t) => {
  t.plan(1)
  const server = testServer(app)
  const result = await fetch(server.url + '/movies').then(r => r.json())
  t.deepEqual(result, ['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])

  server.close()
})


엄청난! 우리의 테스트는 간단하지만 우리의 목적에 부합해야 합니다. 실행해 보겠습니다.

노드 테스트/movies_test.js

not ok 1 should be strictly equal
  ---
    operator: equal
    expected: |-
      ['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack']
    actual: |-
      { message: 'not authorized' }


문제가 무엇입니까?



엔드포인트가 안전하기 때문에 테스트할 수 없습니다. 이 문제를 해결하려면 어떻게 해야 합니까? sinon의 스텁 기능을 사용할 수 있습니다.

const test = require('tape')
const testServer = require('@twilson63/test-server')
const fetch = require('node-fetch')
const sinon = require('sinon')

const auth = require('../middleware/auth')
sinon.stub(auth, 'check').callsFake(function (req, res, next) {
  req.user = 'bob'
  next()
})

const app = require('../server')

test('List Movies', async (t) => {
  t.plan(1)
  const server = testServer(app)
  const result = await fetch(server.url + '/movies').then(r => r.json())
  t.deepEqual(result, ['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])

  server.close()
})


결과

TAP version 13
# List Movies
ok 1 should be deeply equivalent

1..1
# tests 1
# pass 1

# ok


sinon.js는 무엇입니까?



Sinon은 애플리케이션에 대한 스파이, 스텁 및 모의 코드를 제공하는 독립형 모의 라이브러리입니다. https://sinonjs.org/  — 나는 Sinon을 남용하지 않는 것이 좋지만 이와 같은 문제에 유용할 수 있습니다. .

요약



보안에 대한 테스트는 코드 테스트에 중점을 둔 테스트를 생성하는 데 유용할 수 있는 sinon과 같은 까다로운 조롱 도구입니다.

전체 예제는 여기에서 볼 수 있습니다: https://github.com/hyper63/testing-secure-endpoints

좋은 웹페이지 즐겨찾기