Упаковка тестового файла Pytest в качестве исполняемого файла - PullRequest
0 голосов
/ 04 марта 2019

Итак, я разработал тестовый пакет Pytest, который состоит из скрипта Python:

class TestClass():

   test_a()

   test_b()

Мне интересно, могу ли я упаковать свои тесты как исполняемый файл и запустить его?Причина в том, что я хочу избежать установки пакетов python и python на все машины, на которых я собираюсь выполнить тесты.

Ответы [ 3 ]

0 голосов
/ 07 марта 2019

Вы можете использовать pyinstaller, если ваш сценарий написан так, чтобы его можно было запускать как exe.Если вы используете anaconda, то вам просто нужно запустить

pyinstaller --onefile path_to_your_file

, хотя я обычно запускаю что-то подобное, чтобы избежать ошибок, которые я получаю с PyQt5

pyinstaller --onefile --exclude-module PyQt5 --noconsole C:\username\etc\script.py

https://www.pyinstaller.org/

посмотрите на следующее, чтобы заморозить ваш скрипт с помощью pytest

"Freezing pytest

Если вы замораживаете свое приложение, используя такой инструмент, как PyInstaller, чтобы распространить его среди своих конечных пользователей, этоХорошей идеей будет также упаковать тестового бегуна и запустить ваши тесты с помощью замороженного приложения.Таким образом ошибки упаковки, такие как зависимости, не включенные в исполняемый файл, могут быть обнаружены на раннем этапе, а также позволяют отправлять тестовые файлы пользователям, чтобы они могли запускать их вих машины, которые могут быть полезны для получения дополнительной информации о трудно воспроизводимой ошибке.

К счастью, в последних выпусках PyInstaller уже есть настраиваемый хук для pytest, но если вы используете другой инструмент для замораживания исполняемых файлов, таких как cx_freeze илиpy2exe, вы можете использовать pytest.freeze_include (), чтобы получить полный списоквнутренних модулей pytest.Однако настройка инструментов для поиска внутренних модулей варьируется от инструмента к инструменту.

Вместо того, чтобы замораживать исполняющий элемент pytest как отдельный исполняемый файл, вы можете заставить свою замороженную программу работать в качестве запускающего pytest с помощью некоторого умного аргумента.обработка во время запуска программы.Это позволяет вам иметь один исполняемый файл, что обычно более удобно.Обратите внимание, что механизм обнаружения плагинов, используемый pytest (точки входа setupttools), не работает с замороженными исполняемыми файлами, поэтому pytest не может автоматически найти сторонние плагины.Чтобы включить сторонние плагины, такие как pytest-timeout, они должны быть явно импортированы и переданы в pytest.main. "

# contents of app_main.py
import sys
import pytest_timeout  # Third party plugin

if len(sys.argv) > 1 and sys.argv[1] == "--pytest":
    import pytest

    sys.exit(pytest.main(sys.argv[2:], plugins=[pytest_timeout]))
else:
    # normal application execution: at this point argv can be parsed
    # by your argument-parsing library of choice as usual
    ...

Эта большая цитата блока взята из здесь .

0 голосов
/ 25 марта 2019

Не видя, чего вы хотите достичь, вот где я получил.Я использовал модифицированную версию вашего кода, которая может запускаться самостоятельно.

import pytest

class TestSanity(): 
    def test_step_1(self): 
        assert 2==2 
#        if __name__ == "__main__": 
        test=pytest.main(['-v', '-x', '--durations=0'])
        print(test)


TestSanity().test_step_1()

Я сохранил это как "pytest_with_pyinstaller.py"

Затем я использовал эту строку в приглашении anaconda для упаковкифайл pyinstaller

pyinstaller --exclude-module PyQt5 --hidden-import pytest.mark --hidden-import py._builtin    --onefile --hidden-import pytest.main U:\PLAN\BCUBRICH\Python\Tests\pytest_with_pyinstaller.py

Затем я запустил полученный .exe-файл из консоли windows cmd.

>Run>cmd
>cd "your output director"
>"your_exe.exe"

C: \ Users \ bcubrich \ dist \ test2> pytest_with_pyinstaller.exe ============================ начинается тестовая сессия ============================= Платформа win32 - Python 3.7.1, pytest-4.0.2, py-1.7.0, pluggy-0.8.0 - C: \ Users \ bcubrich \ dist \ test2 \ pytest_with_pyinstaller.exe cachedir: .pytest_cache rootdir: C: \ Users \ bcubrich \ dist \ test2, inifile: собрано 0 элементов

======================== ни один тест не был выполнен за 0,01 секунды =========================

5

5 в конце этой строки, кажется, является строкой pytest, и это то же самое число, которое я получаю, когда запускаю этот код в spyder, так что я думаю, что это работает, за исключением того, что скрипт pytest попытается проверить что-либо в каталоге dist.

0 голосов
/ 07 марта 2019

Создайте файл python и вызовите оттуда тесты, используя пакет pytest:

import pytest

pytest.main(['mytestdir'])

пакет main.py и тестовые файлы в исполняемом файле, как вы это делаете в любом проекте python.Сохраните main.py в качестве исполняемой точки входа.

Подробнее о запуске pytest из python: https://docs.pytest.org/en/latest/usage.html#calling-pytest-from-python-code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...