Подсчет результатов тестирования в JUnit-стиле в XML-файле - PullRequest
0 голосов
/ 23 января 2019

Исходная база состоит из нескольких библиотек / модулей Python, отделенных друг от друга. Для каждого из них существует набор тестов, т.е.

  • модуль называется: foo, с несколькими файлами,
  • соответствующий файл теста test_foo.py, с двумя тестами, написанными с использованием Pytest.

После запуска тестов я получаю файл XML, сгенерированный с содержимым, подобным следующему:

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="foo/test_foo" tests="1" failures="0" errors="0">
    <testcase name="foo/test_foo" status="run" duration="9" time="9"></testcase>
    <system-out><![CDATA[============================= test session starts ==============================
platform linux -- Python 3.6.6, pytest-3.10.1, py-1.7.0, pluggy-0.8.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: ..., inifile: pytest.ini
plugins: timeout-1.3.2, mock-1.10.0, cov-2.6.0
timeout: 60.0s
timeout method: thread
timeout func_only: False
collecting ... collected 2 items

::test_foo_test1
-------------------------------- live log setup --------------------------------
# ... some logging performed in the test...
PASSED                                                                   [ 50%]
::test_foo_test2
-------------------------------- live log call ---------------------------------
# ... some logging performed in the test...
PASSED                                                                   [100%]

=========================== 2 passed in 6.63 seconds ===========================]]></system-out>
  </testsuite>
</testsuites>

( примечание : невыровненная часть заключена в маркеры system-out)

Мой pytest.ini файл довольно прост и содержит только информацию о регистрации (log_cli*, log_file*) и timeout. Я использую bazel в качестве системы сборки, которая определяет py_test заданий, и я предполагаю, что она каким-то образом неявно добавляет настройки вывода по умолчанию. Это должно, однако, работать аналогично даже при непосредственном запуске.

Теперь я хотел бы обработать кучу этих файлов XML и извлечь общее количество выполненных тестов, ошибок и т. Д. Проблема, показанная в примере, состоит в том, что файл XML утверждает, что число тестов равно tests="1", тогда как стандартный вывод из журнала показывает, что было собрано как минимум два элемента.

Мне кажется, что этот формат учитывает все файлов как контрольных примеров , а не как фактические контрольных примеров , собранные в файлы.

Есть ли в Python простой способ сделать так, чтобы тестовый набор содержал число collected items?

1 Ответ

0 голосов
/ 23 января 2019

Используете ли вы флаг --junitxml =thing.xml? https://docs.pytest.org/en/latest/usage.html#creating-junitxml-format-files

Когда я использую флаг --junitxml и полученный вывод содержит правильное количество тестов. Я предполагаю, что bazel - это тот, кто генерирует вывод xml, а не pytest, и что весь ваш цикл pytest рассматривается как один тест.

Я думаю, что это, вероятно, должен быть вопрос с тегом bazel, так как он действительно "как я могу прочитать bazel дополнительные xml-файлы?", А затем использовать --junitxml для генерации вашего собственного xml.

Еще одна вещь. Если ваши xml-файлы становятся большими со всем захваченным выводом, я рекомендую сделать следующее:

  1. Запускать с -s, чтобы не захватывать вывод
  2. Если вам нужен журнал сеанса, запустите все это как "pytest -s --junitxml = out.xml [другие флаги, тестовые каталоги, файлы и т. Д.]> Out.txt"

Затем вам нужно будет также заархивировать файл out.txt, но он не позволит сохранить размер XML-файла.

...