Разрабатываем тестовый скрипт, запускам и получаем классный отчет с результатами

Всем привет. Как часто вам нужно разрабатывать сотни авто тестов и предоставлять заинтересованным лицам отчеты с результатами? Лично мне очень часто. В этом мне помогает Anna.

Зачем это нужно

Я работаю QA инженером в крупной IT компании. Мы предоставляем тестирование как сервис. К нам обращаются команды, которые разрабатывают свой продукт за автоматизацией ручных тестов. Как правило, это UI или API тесты. Многие не понимают, что такое автоматизация тестов и приходится каждый раз объяснять, что к чему. Самое главное в любом тестировании это результаты тестирования. Все будет отлично, если они представлены в удобном и понятном виде. Исторически сложилось, что мы используем для отчетов Allure Framework. Наши клиенты привыкли видеть результаты в таком виде.

Одно из окно отчета
Одно из окно отчета

Моя команда пишет тестовые скрипты на Python. Мы первая команда в нашей компании, которая внедрила данный язык в тестирование. Я всегда хотел делать больше и затрачивать на это как можно меньше времени. В Python отличные встроенные и пользовательские библиотеки, но они не удовлетворяли наши запросы в полной мере. Приходилось импортировать кучу библиотек, писать длинный код и тратить на написание много времени. Время разработки и поддержки - главные критерий, который я установил. Для этого была разработана Anna.

Как установить

Для установки выполнить следующую команду:

python -m pip install anna-api-test-framework

Как использовать

Для начала импортируем библиотеку

from anna import Actions, Report, Asserts

Для использования предоставляется три класса.

  • Actions - содержит методы для выполнения http запросов. Под капотом спрятана библиотека requests. Все данные о запросах и отчетах автоматически добавляются в отчет о тестировании.

action = Action(url=url)
response = action.request(method=method)
Данные о запросе и ответе в отчете
Данные о запросе и ответе в отчете
  • Report - содержит методы для добавления необходимых данных в отчет: шаги, названия тестов, группировка тестов, ссылки, описание и т.п.

@Report.epic('Simple tests')
@Report.story('Tests google')
@Report.testcase('https://www.google.com', 'Google')
@Report.link('https://www.google.com', 'Just another link')
class TestExample:

    @Report.title('Simple test google')
    @Report.severity('CRITICAL')
    def test_simple_request(self):
        url = 'https://google.com'
        method = 'GET'
        want = 200 
        Report.description(url=url, method=method, other='other information')
  • Asserts - содержит методы для проверки условий тестов.

with Report.step('Checking response'):
    Assert.compare(
        variable_first=want,
        comparison_sign='==',
        variable_second=got,
        text_error='Response status code is not equal to expected'
    )

Как запустить тесты

Для запуска используем следующую команду:

python -m pytest --alluredir="./results"

Мы используем для своих тестов библиотеку pytest. Данной командой мы запускам все тесты из текущей директории и указываем куда сохранять данные с результатами тестов. В данном случае сохраняем все в директорию results

Как сформировать отчет

Для формирования и отображения отчета необходимо установить утилиту Allure.

Далее используем команду для формирования отчета из полученных тестовых данных в директории results:

allure generate "./results" -c -o "./report"

Данная команда формирует отчет в директорию report

Как открыть отчет

Выполняем следующую команду:

allure open "./report"

Команда запускает локальный сервер через который мы получаем доступ к отчету из директории report в своем браузере.

Сформированный отчет
Сформированный отчет

Данный отчет сформирован на основе следующего тестового скрипта:

from anna import Action, Report, Assert

# добавляем всю необходимую информацию для набора тестов, а также
# группируем их
@Report.epic('Simple tests')
@Report.story('Tests google')
@Report.testcase('https://www.google.com', 'Google')
@Report.link('https://www.google.com', 'Jast another link')
class TestExample:

    # тестовый метод. Задаем ему имя и важность
    @Report.title('Simple test google')
    @Report.severity('CRITICAL')
    def test_simple_request(self):
        url = 'https://google.com'
        method = 'GET'
        want = 200
        # добавляем описание в отчет со всей необходимой
        # информацией
        Report.description(url=url, method=method, other='other information')
        # создаем новый объект класса Action
        action = Action(url=url)
        # выполняем запрос
        response = action.request(method=method)
        # получаем код ответа
        got = response.status_code
        # вставляем шаг теста в отчет
        with Report.step('Checking response'):
            # проверяем код ответа
            Assert.compare(
                variable_first=want,
                comparison_sign='==',
                variable_second=got,
                text_error='Response status code is not equal to expected'
            )

Итог

Данный инструмент ускоряет разработку тестовых скриптов для API тестов и стандартизирует вид тестового отчета на всех проектах. Наши тесты гоняются в CI/CD (Jenkins) и запускаются автоматически по событиям. Остается только смотреть отчеты и поддерживать тесты в актуальном состоянии.

Ссылка на репозиторий github

P.S.

Спасибо за ваше внимание. Буду рад услышать ваши мнения, предложения и замечания

Комментарии (8)


  1. ivansibaha
    08.04.2022 10:52

    Так в чем смысл этой Анны? Это тестовый фреймворк? Чем он лучше того же pytest ? Импортировать до кучи специальные асерты ещё. Отчёт в том же аллюре. Может ли Анна работать с ui тестами? Если нет, то это очень неудобно в том плане, что нужно тогда что-то ещё импортировать. Как по мне, аллюр + питест + реквесты - это удобно. Если надо ui тесты - мы просто добавляем selenium


    1. EvgeniiGerasin Автор
      08.04.2022 10:56

      Смысл в том, что мне нужно меньше времени тратить на отчет. Я знаю что при выполнении запроса все данные автоматически добавятся в него. Как я уже писал, библиотека помогает стандартизировать отчет на всех проектах. У нас на каждом проекте закреплены разные люди и хочется, чтобы все отчеты со всех проектов были одинаковыми. Для UI тестов у нас другая библиотека


  1. gigimon
    08.04.2022 11:30

    Посмотрел пример, что фреймворк упростил? теже самые декораторы, как у allure, добавляет туже самую информацию. Данные из requests передавать надо явно используя Action (зачем, если можно у requests кастомную реализацию сессии прилепить). Ассерты еще более ужасные, с кучей параметров и наверняка ломающие красивый вывод pytest.

    Все это можно реализовать сильно красивее используя магию pytest


    1. EvgeniiGerasin Автор
      08.04.2022 13:08

      Вывод не ломается. Расскажите как быстро (быстрее чем с этим инструментом) можно реализовать на чистом pytest


      1. gigimon
        08.04.2022 13:14

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


        1. EvgeniiGerasin Автор
          08.04.2022 13:29

          Вы писали, что ассерты ужасны и наверняка ломают вывод, так вот - ничего не ломается


  1. Faenor
    08.04.2022 11:57

    Это просто кастомная обертка над аллюр.. По мне так не тянет на отдельный плагин если честно. Всю логику можно описать в одном/двух классах прямо в проекте.

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

    Плюс вопрос в том - если у меня в одном проекте и интеграционные и UI тесты - мне отдельно allure использовать и отдельно ваш плагин? Это как минимум неудобно...

    Да и в целом мне честно говоря не очень нравятся плагины плагинов. В какой-то момент возникнут проблемы с версиями allure или pytest. Ваш плагин сломается, придется идти искать его новую версию, не факт что она будет корректно работать и т.д.


    1. EvgeniiGerasin Автор
      08.04.2022 13:10

      1. Для изменения вывода используется метод description

      2. Мы разделяем проекты по UI и API тестам так, как это разные уровни тестирования

      3. Не возникает проблем так, как жестко прописаны версии сторонних библиотек