Как собрать покрытие кода в Стамбуле при выполнении конечных точек HTTP через Почтальона или Каратэ - PullRequest
3 голосов
/ 30 января 2020

У меня есть проект JS, который предоставляет набор конечных точек, использующих Express с типичным шаблоном экспресс / маршрутизатор.

const express = require('express');
const router = new express.Router();

router.post('/', async (req, res, next) => { });
router.get('/:abc', async (req, res, next) => { });

module.exports = router;

Я могу успешно запустить сервер с npm start, который вызывает node ./src/index.js и делает конечные точки доступными в https://localhost:8080

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

Проблема, с которой я сталкиваюсь, заключается в том, что я могу Кажется, что при использовании источника с JS по http://localhost: 8080 .

я пробовал npm start, а затем nyc --all src/**/*.js gradlew test. Последнее является автоматизацией, которая проверяет конечные точки. Это приводит к 0% покрытию, которое, как я предполагаю, было связано с тем, что ny c не запускался с npm start.

Затем я попробовал nyc --all src/**/*.js npm start и заметил некоторое покрытие, но это было только покрытие с начала сервер Express.

Затем я попытался nyc --all src/**/*.js npm start, затем gradlew test и заметил, что результаты покрытия кода были такими же, как при отсутствии тестов конечной точки.

Далее я попытался поставить предыдущие две команды в один JS сценарий (myscript. js), выполняемый каждой асинхронно, причем сервер Express был запущен до того, как начались тесты gradle и запустились nyc --all src/**/*.js myscript.js. Результаты этого были такими же, как в моем предыдущем испытании, где только npm start получил покрытие кода.

Затем я попытался nyc --all src/**/*.js npm start, затем nyc --all src/**/*.js -no-clean gradlew test и заметил, что результаты покрытия кода были такими же, как когда были запущены тесты конечных точек.

Затем я попробовал все вышеописанные попытки, поместив их в пакет. json Сценарии и запустив npm run <scriptName>, получив точно такое же поведение.

Наконец я попробовал nyc instrument src instrumented/src --compact=false, за которым следует npm run start:coverage, где этот запуск: сценарий покрытия вызывает инструментированный индекс. js в node ./instrumented/src/index.js, затем gradlew test, за которым следует nyc report --reporter=lcov. Эта попытка также не привела к созданию какого-либо дополнительного покрытия кода из тестов конечной точки gradlew.

Проводя некоторые исследования в Интернете, я наткнулся на этот пост Как настроить покрытие кода на моем Express API на основе?

И подумал, что это похоже на мои проблемы. Например, Стамбул не знает, как покрыть код при его использовании через конечные точки.

Я решил все же опубликовать это, так как вышеописанное сообщение довольно старое и хотел бы узнать мнения и посмотреть, есть ли лучшее решение, чем https://github.com/gotwarlost/istanbul-middleware

РЕДАКТИРОВАТЬ

Более подробные сведения о том, как мы запускаем сервер Express и выполняем автоматизацию без Стамбул сегодня. Просто чтобы уточнить, с чем мы работаем, и инструменты автоматизации, в которые мы инвестировали. (В основном, каратэ и Java)

/*
  calls --> node -r dotenv/config src/index.js
*/
npm start

/*
  calls --> gradlew clean test
  this effectively calls a tool called Karate
  Karate's base url is pointed to: https://locahost:8080
  Karate tests execute endpoints on that base url
  This would be akin to using Postman however Karate has quite a bit of configuration options
  https://github.com/intuit/karate
*/
npm test

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Через много часов исследований нам удалось решить эту проблему. Предыдущий проект, опубликованный @balexandre, был обновлен, чтобы проиллюстрировать, как это сделать.

https://github.com/kirksl/karate-istanbul

0 голосов
/ 01 февраля 2020

Как сказано в комментариях, вы никогда не запускаете сервер для запуска тестов ... тесты будут указывать на ваш сервер, когда вы require файл сервера.

в моем примере, я запуск mocha с chai и пакет chai-http помогает вызвать сервер

server.js

const app = require("express")();

// everything else ...

exports.server = app;

в ваших сквозных тестах вы можете легко получить:

const chai = require('chai');
const chaiHttp = require('chai-http');
chai.use(chaiHttp);

const server = require("./server.js").server;

...

it("should calculate the circumference", done => {
    chai
       .request(server) // <-- attach your server here
       .get('/v1/circumference/10')
       .end((err, res) => {
         expect(res.status).to.be.eql(200);
         expect(res.type).to.be.eql('application/json');
         expect(res.body.result).to.eql(62.83185307179586);
         done();
       });
    });
});

Я сделал очень простой проект и отправил его на GitHub, чтобы вы могли оформить заказ и запустить все по порядку чтобы увидеть, как все работают вместе

GitHub Project


Добавлено

Я добавил маршрут, чтобы он может показать отчет о покрытии (я использовал html отчет ) и создал stati c маршрут к нему ...

при запуске покрытия npm run coverage он будет генерировать отчет внутри папки ./report и простой маршрут express, указывающий на эту папку, позволят увидеть его как конечную точку.

информация о коммите за такое изменение

...