Typescript mocha allure reports generation

Теги: #<Tag:0x00007f7900f7c648> #<Tag:0x00007f7900f7c300> #<Tag:0x00007f7901d23e40> #<Tag:0x00007f7901d23af8> #<Tag:0x00007f7901d22f90> #<Tag:0x00007f7901d22720>

Добрый день,

Пробую запустить mocha + allure

  • npm install mocha-allure-reporter
  • запускаю тесты, allure-results папка создается
  • генерю репорты allure generate --clean, папка allure-reports создается
  • открываю отчет

UI работает, но тестов нет … тупо пусто. 404 Not found на месте где должен быть контекнт. Панельки работают…

Что не так делаю?
Как я понял аллюр должен считывать анотации mocha и формировать тест репорт, даже без использования степов … …
Репорты работают например с good-mocha-html-reporter , но когда запускаешь вместе с mocha-parallel-tests то не отресовывает все репорты…

Буду благодарен за помощь, подсказки куда копать.

как то неожиданно все получилось…вопрос закрыт. Делал так:
sudo apt-add-repository ppa:yandex-qatools/allure-framework
sudo apt-get install allure-commandline
allure generate allure-results/
allure report open

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

А ты пробовал что-то крепить к отчетам?

что вы имеете в виду?

В апи тестах запрос ответ логирую в степы, ну а UI стандартно скриншеты в степах. Вроде больше ничего не надо…Видео не пишем.

подскажи пожалуйста как ты крепишь реквест/респонс в отчет

Вместе с аллюром должна идти библиотечка работы с результатами теста и текущим состоянием аллюра

в ней вы по идентификатору теста можете апдейтить результаты теста, шагов, описание и все такое

У нас есть (к сожалению) 2 способа как делать это:

  1. [wrong] Создаем степ, внутри которого пишем вложенные степы и прямо в тайтл степа пишем все нужные данные. Урл, хидеры, бади … … все что надо. Получается чибельно в принципе, но json например не отформатированный. Все завернуто в одном месте в кастумный логгер класс.
private static logToHtmlReporter(body: string, response: WebRequest.Response<string>, logResponse: boolean) {
        HtmlReporter.setDescriptionStep('Request:____________________');
        HtmlReporter.setDescriptionStep(response.method + ' ' + response.request.uri.href);

        for (const header  of Object.keys(response.request.headers)) {
            HtmlReporter.setDescriptionStep(header + ': ' + response.request.headers[header]);
        }

        if (body) {
            HtmlReporter.setDescriptionStep(body);
        }
        HtmlReporter.setDescriptionStep('Response:____________________');
        HtmlReporter.setDescriptionStep('Status Code: ' + response.statusCode);

        for (const header  of Object.keys(response.headers)) {
            HtmlReporter.setDescriptionStep(header + ': ' + response.headers[header]);
        }
        if (response.content && logResponse) { // if image returned as response = allure fail with internal error
            HtmlReporter.setDescriptionStep(response.content);
        } else {
            HtmlReporter.setDescriptionStep('Response empty or contains specific content. See console logs to see real response');
        }
    }

HtmlReporter
setDescriptionStep(info: string) {
        HtmlReporter.startStep(info);
        HtmlReporter.endStep();
    }

Ну и там рядом еще в консольку ложится красиво…

  1. [correct] На метод вешается анотация и все входящие параметры метода логируются автоматом как аттачмент. Более елегантный метод, так как аллюр красиво ложит джсоны …
export function step(msg?: string) {
    return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        const method = descriptor.value;
        const allureReport = AllureReport.getReporter();
        const reporter = allureReport.allure;
        descriptor.value = async function(...args) {
            let result;
            const objectArgs = args.filter((arg) => typeof arg === 'object');
            const notObjects = args.filter((arg) => typeof arg !== 'object');
            const params = notObjects.map((arg) => {
                if (arg != null) {
                    return JSON.stringify(arg);
                }
            }).join();
            const stepName = params.length ? `${msg}(${params})` : msg;
            reporter.startStep(stepName, Date.now());
            objectArgs.forEach((arg, index) => {
                try {
                    const param = JSON.stringify(arg, null, '\t');
                    if (param !== 'null') {
                        reporter.addAttachment(`arg${index}`, param, 'application/json');
                    }
                } catch (e) {
                    console.log('WARNING: Reporter error');
                    // console.warn(e);
                }

            });
            try {
                result = await method.apply(this, args);
                reporter.endStep('passed', Date.now());
                return result;
            } catch (e) {
                await drawClickPointAttempt(e);
                await allureReport.takeScreenshot();
                if (e.toString().includes('AssertionError')) {
                    reporter.endStep('failed', Date.now());
                } else {
                    reporter.endStep('broken', Date.now());
                }
                throw e;
            }
        };
        return descriptor;
    };
}