[英]Unit testing and Integration testing
我目前正在開發一個nodejs / express rest api(個人項目),我想從這個項目中學到很多東西。
所以在我的項目中,我使用sequelize
作為ORM
層,我有一個名為`bus的模型,並且我已經為該模型構建了CRUD端點。
現在,我想對已經開發的該模型/ api進行一些測試,閱讀了一些有關測試的教程,發現有多種類型的測試分為兩大類:白盒與黑盒。
所以我寫了一些測試我的api的集成測試(集成測試是黑盒測試)
而且我想知道要編寫一些單元測試,但是我不知道要測試什么, bus
模型是Sequelize模型,因此我要測試的所有內容都已經在它自己的sequelize
庫中進行了測試。 並通過集成測試來測試api端點。
PS:這是我第一次編寫測試。
我正在使用以下技術: nodejs
, sequelize
, express
, mocha
和chai
。
總線型號定義
const Sequelize = require('sequelize');
module.exports = function(sequelize) {
let Bus = sequelize.define('bus', {
name: {
type: Sequelize.STRING,
},
});
Bus.associate = function(models) {
Bus.hasOne(models.LaneBus, {
foreignKey: 'busId'
});
};
return Bus;
}
總線Api端點測試
const request = require('superagent');
const expect = require('chai').expect;
const app = require('../../src/app');
var http = require('http');
const models = require('../../src/models');
describe("bus", function () {
var bus_id;
it('should create bus', function (done) {
request.post('http://localhost:3000/bus')
.type('form')
.send({
name: 'bus_test_1',
}).set('Accept', 'application/json')
.set('Authorization', global.JWT_TOKEN_TEST_ADMIN)
.end((err, res) => {
expect(res.status).to.be.eq(201, 'invalid return code');
expect(res.body.status).to.be.eq('success', 'invalid retun status');
bus_id = res.body.id;
done();
})
});
it('should get list of bus', function (done) {
request.get('http://localhost:3000/bus')
.set('Accept', 'application/json')
.end((err, res) => {
expect(res.status).to.be.eq(200, 'invalid return code');
expect(res.body.metadata).to.not.be.undefined
done();
})
});
it('should modify bus', function (done) {
request.put(`http://localhost:3000/bus/${bus_id}`)
.type('form')
.send({
name: 'bus_test_2'
})
.set('Authorization', global.JWT_TOKEN_TEST_ADMIN)
.end((err, res) => {
expect(res.status).to.be.eq(200, 'invalid return code');
expect(res.body.status).to.be.eq('success', 'invalid retun status');
done();
});
});
it('modify bus should get error because bus dont exists', function (done) {
request.put(`http://localhost:3000/bus/aaa`)
.type('form')
.send({
name: 'bus_test_2'
})
.set('Authorization', global.JWT_TOKEN_TEST_ADMIN)
.end((err, res) => {
expect(res.status).to.be.eq(404, 'invalid return code');
expect(res.body.status).to.be.eq('failure', 'invalid return code');
done();
});
});
it('should get bus', function (done) {
request.get(`http://localhost:3000/bus/${bus_id}`)
.end((err, res) => {
expect(res.status).to.be.eq(200, 'invalid return code');
expect(res.body.name).to.be.eq('bus_test_2');
done();
});
});
it('get bus should return error because bus dont exist', function (done) {
request.get(`http://localhost:3000/bus/aaaa`)
.end((err, res) => {
expect(res.status).to.be.eq(404, 'invalid return code');
expect(res.body.status).to.be.eq('failure', 'invalid return code');
done();
});
});
it('user role cannot create bus', function (done) {
request.post('http://localhost:3000/bus')
.type('form')
.send({
name: 'bus_test_1',
}).set('Accept', 'application/json')
.set('Authorization', global.JWT_TOKEN_TEST_USER)
.end((err, res) => {
expect(res.body.status).to.be.eq('failure', 'invalid retun status');
done();
})
})
it('user role cannot modify bus', function (done) {
request.put(`http://localhost:3000/bus/${bus_id}`)
.type('form')
.send({
name: 'bus_test_2'
})
.set('Authorization', global.JWT_TOKEN_TEST_USER)
.end((err, res) => {
expect(res.body.status).to.be.eq('failure', 'invalid retun status');
done();
});
})
it('user role cannot delete bus', function (done) {
request.delete(`http://localhost:3000/bus/${bus_id}`)
.set('Authorization', global.JWT_TOKEN_TEST_USER)
.end((err, res) => {
expect(res.body.status).to.be.eq('failure', 'invalid return code');
done();
});
})
it('should delete bus', function (done) {
request.delete(`http://localhost:3000/bus/${bus_id}`)
.set('Authorization', global.JWT_TOKEN_TEST_ADMIN)
.end((err, res) => {
expect(res.status).to.be.eq(200, 'invalid return code');
done();
});
});
it('delete bus should get error because bus dont exist', function (done) {
request.delete(`http://localhost:3000/bus/${bus_id}`)
.set('Authorization', global.JWT_TOKEN_TEST_ADMIN)
.end((err, res) => {
expect(res.status).to.be.eq(404, 'invalid return code');
expect(res.body.status).to.be.eq('failure', 'invalid return code');
done();
});
});
});
不清楚的要求/例外使代碼難以測試。 有時,您只是不知道什么會破壞您的代碼。 在現實世界中,這種情況一直存在。 您不知道什么會破壞您的代碼。 否則,您將其修復。
在任何情況下,我都建議測試代碼覆蓋率,例如Istanbul 。 確保您的代碼至少經過80%的測試。 稍后,當您更新代碼或修復錯誤時,您可以查看未測試的內容,並添加相應的測試。
集成(黑盒)測試:我建議使用CucumberJS進行集成測試,因為它提供了用於定義功能的簡單語言,並且可以測試端到端功能,而不僅僅是API端點。 例如:
Feature: Simple maths In order to do maths As a developer I want to increment variables
白盒單元測試:Mocha&Chai很好,因此您可以繼續進行這些測試,但是我會添加Sinon作為存根和模擬對象。 因此,您上面的測試可以轉換為集成測試(例如Yakbak之類的東西 ),或者通過另一種方法將它們轉換為Sinon的單元測試。
這些是我的建議,但您可以隨意瀏覽並選擇自己喜歡的庫進行測試。 只要確保您將集成測試和單元測試區分開即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.