簡體   English   中英

單元測試和集成測試

[英]Unit testing and Integration testing

我目前正在開發一個nodejs / express rest api(個人項目),我想從這個項目中學到很多東西。

所以在我的項目中,我使用sequelize作為ORM層,我有一個名為`bus的模型,並且我已經為該模型構建了CRUD端點。

現在,我想對已經開發的該模型/ api進行一些測試,閱讀了一些有關測試的教程,發現有多種類型的測試分為兩大類:白盒與黑盒。

所以我寫了一些測試我的api的集成測試(集成測試是黑盒測試)

而且我想知道要編寫一些單元測試,但是我不知道要測試什么, bus模型是Sequelize模型,因此我要測試的所有內容都已經在它自己的sequelize庫中進行了測試。 並通過集成測試來測試api端點。

PS:這是我第一次編寫測試。

我正在使用以下技術: nodejssequelizeexpressmochachai

總線型號定義

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%的測試。 稍后,當您更新代碼或修復錯誤時,您可以查看未測試的內容,並添加相應的測試。

  1. 集成(黑盒)測試:我建議使用CucumberJS進行集成測試,因為它提供了用於定義功能的簡單語言,並且可以測試端到端功能,而不僅僅是API端點。 例如:

     Feature: Simple maths In order to do maths As a developer I want to increment variables 
  2. 白盒單元測試:Mocha&Chai很好,因此您可以繼續進行這些測試,但是我會添加Sinon作為存根和模擬對象。 因此,您上面的測試可以轉換為集成測試(例如Yakbak之類的東西 ),或者通過另一種方法將它們轉換為Sinon的單元測試。

這些是我的建議,但您可以隨意瀏覽並選擇自己喜歡的庫進行測試。 只要確保您將集成測試和單元測試區分開即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM