Всё о web

Для чайников и не только


Express API сервер Часть 2, подключаем eslint и автотесты

Декабрь 24, 2016

Продолжаем пилить express API сервер. После того как мы сделали простейшую реализацию приложения, нам нужно сделать несколько очень полезных шагов: подключить eslint и автотесты.

Подключаем eslint

Это самый простейший шаг для улучшения качества кода. Для начала его нужно установить, открываем package.json и добавляем пару новых пакетов в зависимости:

  "dependencies": {
    "express": "*",
    "express-ws": "*",
    "eslint": "*",
    "mocha": "*"
  }

Заодно добавили пакет "mocha", он нам потребуется немного погодя. Далее выполняем:

npm install

И выполняем

eslint --init

Либо, можем вручную создать файл .eslintrc.json со следующим содержимым:

{
    "env": {
        "node": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "sourceType": "module"
    },
    "rules": {
        "no-console": 0,
        "indent": [
            "error",
            2
        ],
        "linebreak-style": [
            "error",
            "unix"
        ],
        "quotes": [
            "error",
            "single"
        ],
        "semi": [
            "error",
            "never"
        ]
    }
}

Теперь с помощью команды:

eslint js/*

Мы сможем проверить весь наш проект, в моём случае получилось:

Проверка кода с помощью eslint

Пара ошибок связана с неправильными отступами, ещё пара с объявленными но неиспользуемыми переменными. И одна настоящая ошибка:

Ошибка найденная eslint

Я просто напросто не подключил модуль errors в наш единственный экшен. После такой демонстрации, думаю будет излишне рассказывать зачем нужен eslint.

Делаем автотесты

Создаём папку test в корне нашего проекта, создаём файл router.js и пишем простенькие тестики:

'use strict'

const Router = require('../js/router')

describe('Router', function() {
  
  it('parseRequest', function(done) {
    const wrongData = 'ign98374g5yg'
    const rightData = JSON.stringify({
      get: 'randomString',
      length: 123
    })
    const router = new Router()
    
    if( router.parseRequest(rightData) && !router.parseRequest(wrongData) )
      done()
  })
  
  it('go', function(done) {
    const router = new Router()
    let wrongResult = false
    
    const wrongData = JSON.stringify({
      get: 'unknownAction',
      param: 123
    })
    const rightData = JSON.stringify({
      get: 'randomString',
      length: 10
    })
    
    const rightWs = {
      send: function (str) {
        let data = JSON.parse(str)
        if( (data.code == 200) && wrongResult )
          done()
      }
    }
    
    const wrongWs = {
      send: function (str) {
        let data = JSON.parse(str)
        if( data.code == 404 )
          wrongResult = true
        router.go({}, rightWs, rightData)
      }
    }
    
    router.go({}, wrongWs, wrongData)
  })
  
})

Затем создаём автотесты для нашего единственного экшена, файл randomString.js:

'use strict'

const RandomString = require('../js/actions/randomString')

describe('action/randomString', function() {
  
  it('getRandomString', function(done) {
    const randomString = new RandomString()
    const result = randomString.getRandomString(10)
    if( result.length == 10 )
      done()    
  })
  
  it('response', function(done) {
    const randomString = new RandomString()
    let wrongResult = false
    
    const rightData = {
      get: 'randomString',
      length: 12
    }
    const wrongData = {
      get: 'randomString',
      asd: 12
    }
    
    const rightWs = {
      send: function (str) {
        let data = JSON.parse(str)
        if( (data.code == 200) && (data.data.length == 12) && (typeof(data.data) == 'string') && wrongResult )
          done()
      }
    }
    
    const wrongWs = {
      send: function (str) {
        let data = JSON.parse(str)
        if( data.code == 400 )
          wrongResult = true
        randomString.response(rightWs, rightData)
      }
    }
    
    randomString.response(wrongWs, wrongData)
  })
  
})

Автотесты готовы. Теперь подправим наш package.json, в нём нужно указать как запускать тесты и линт, обновляем секцию "scripts":

  "scripts": {
    "test": "mocha --reporter spec --bail --check-leaks test/",
    "lint": "eslint ./js/*"
  },

Весь package.json теперь выглядит так:

{
  "name": "api-express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha --reporter spec --bail --check-leaks test/",
    "lint": "eslint ./js/*"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "*",
    "express-ws": "*",
    "eslint": "*",
    "mocha": "*"
  }
}


Из корня проекта запускаем тесты:

npm test

На выходе получаем:

результаты автотестов

Значит всё ок.

Зачем нужны автотесты

Если Вы задумались над этим вопросом, значит Вы явно не сталкивались с большими проектами, которые пилят одновременно много людей.

Автотесты позволяют убедиться что новый код совместим со старым и поведение старого кода не изменилось. Например если другой разработчик в нашем контроллере что-то поломает, то автотесты это покажут.

В по настоящему большом проекте Вы физически не можете отследить все изменения кода, более того, спустя время, Вы сами начинаете забывать где и что делали, и можете что-то поломать, автотесты об этом сразу скажут.

Обновлённый архив с проектом



Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *