как обращаться с sys.argv в pytest? - PullRequest
1 голос
/ 13 мая 2019

платформа Linux - Python 3.6.7, pytest-4.4.0, py-1.8.0, pluggy-0.9.0

#example.py
try:
    import configparser
except ImportError:
    import ConfigParser as configparser

CONFIG = configparser.ConfigParser()
CONFIG.read(sys.argv[1])
ININFO = {i:dict(CONFIG.items(i)) for i in CONFIG.sections()}
DATANAME = ININFO['data']['name']

def somefunction(DATANAME):
    """
        This function will take lot of variables from ini file
    """
    print(DATANAME)
    s1 = "Pass"
    s2 = "Fail"
    s3 = "Pass"
    print(s1, s2, s3)
    return [s1, s2, s3]

def test_somefunction():
    """
        Test function
           - Will check whether all steps are passed or not.
    """
    status = somefunction()
    for sts in status:
        assert sts == 'Pass', "Test has Failed!"

if __name__ == "__main__":

    somefunction()

То же, что и выше, код У меня так много файлов, и у всех естьвстроенные тесты

Как я выполняю это

#sudo python3 example.py inifile.ini

Пожалуйста, дайте мне знать, Как я могу выполнить это с pytest и без изменения кода.

, если я заменюsys.argv[1] с именем файла это прекрасно работает, как показано ниже

sudo python3 -m pytest -s 

Укажите мне, как я могу справиться с этим.

Я добавил и проверьте скриншот ниже Изображение ошибки

пример ini-файла test.ini

[data]
name = some.name
age = 22

[data1]
name = someother.name
age = 32

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Как я уже говорил, вам просто нужно создать файл python для вызова pytest и аргументов, оттуда будет запущен pytest.

$ python run.py example.py test.ini

Здесь run.py выглядит какниже

$ cat run.py
# run.py
import pytest
import sys

def main():
    # extract your arg here
    print('Extracted arg is ==> %s' % sys.argv[2])
    pytest.main([sys.argv[1]])

if __name__ == '__main__':
    main()

example.py - ваш скрипт на python.

test.ini - ваш INI-файл.

Надеясь, это прояснило ваш запрос.

Все кредиты идут на этот ответ

0 голосов
/ 10 июня 2019

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

import pytest
import sys
import os

def readfile_list(prots):
    """
    fetching all py files
    """
    testcases = []
    for folder in prots:
        for filename in os.listdir(folder):
            if filename.endswith('.py') and filename != "__init__.py" and filename != "run.py":
                testcases.append(folder + "/" + filename)
    return testcases


def main(testcases):
    """
    main function to run testcases
    """
    # extract your arg here
    for tests in testcases:
        print('Extracted arg is ==> %s' % sys.argv[1])
        pytest.main([tests, '--tb=no', '-s'])

if __name__ == '__main__':
    prots = ['folder1', 'folder2']
    testcases = readfile_list(prots)
    main(testcases)
0 голосов
/ 14 мая 2019

Если вы хотите, чтобы sys.argv[1] был равен example.py при запуске pytest, вы можете просто передать имя файла в качестве аргумента:

sudo pytest example.py

Чтобы передать имя файла как sys.argv[1] при запуске sudo pytest (для каждого файла), вы можете создать conftest.py со следующим содержимым:

import pytest
import sys

@pytest.fixture(autouse=True)
def set_sys_argv_1(request, monkeypatch):
    monkeypatch.setattr(sys, 'argv', ['pytest', str(request.fspath)])

Обратите внимание, что он пройдет абсолютный путь к файлу.

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