如何在pytest中处理sys.argv?

时间:2019-05-13 10:03:07

标签: python python-3.x pytest

平台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 

指导我如何处理。

我添加并查看以下屏幕截图 error image

ini文件示例 test.ini

[data]
name = some.name
age = 22

[data1]
name = someother.name
age = 32

3 个答案:

答案 0 :(得分:0)

如果要在运行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)])

请注意,它将传递文件的绝对路径。

答案 1 :(得分:0)

正如我评论的那样,在您只需要创建一个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文件。

希望这可以澄清您的查询。

所有功劳归于stackoverflow.com/a/42778436/4490226

答案 2 :(得分:0)

所以我创建了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)