Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何配置pytest以在生成测试时生成有用的名称?_Python_Selenium_Automated Tests_Metaprogramming_Pytest - Fatal编程技术网

Python 如何配置pytest以在生成测试时生成有用的名称?

Python 如何配置pytest以在生成测试时生成有用的名称?,python,selenium,automated-tests,metaprogramming,pytest,Python,Selenium,Automated Tests,Metaprogramming,Pytest,我正在使用py.test执行一套selenium测试。实际上,我在conftest.py中运行了一个收集器,它生成如下测试(我从pytest文档中偷了这个): 我的测试用例放置在如下所示的对象中: class TestObject(object): def __init__( self, parameter_1, ): self.parameter_1 = parameter_1 self.parameter_2 = parameter_2

我正在使用py.test执行一套selenium测试。实际上,我在conftest.py中运行了一个收集器,它生成如下测试(我从pytest文档中偷了这个):

我的测试用例放置在如下所示的对象中:

class TestObject(object):

def __init__(
        self,
        parameter_1,

):
    self.parameter_1 = parameter_1
    self.parameter_2 = parameter_2
test_cases_values = {
    "friendly_case_name_1": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
    "friendly_case_name_2": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
}
BROWSERS = [
    "('browser_1', SERVER_URL)",
    "('browser_2', SERVER_URL)"
]
class Environment(object):

    def __init__(self, url=URL, port=PORT):
        self.url = url
        self.port = port

    def __name__(self):
        return self.url + ":" + self.port

ENVIRONMENT = Environment()
collected # items <Module 'tests.py'> <Class 'TestClass'> <Instance '()'> <Function "test_function[environment0-test_object0-('browser_1', GRID_SERVER)]"> <Function "test_function[environment1-test_object1-('browser_2', GRID_SERVER)]"> <Function "test_function[environment2-test_object2-('browser_1', GRID_SERVER)]"> <Function "test_function[environment3-test_object3-('browser_2', GRID_SERVER)]"> 我将它们实例化如下:

class TestObject(object):

def __init__(
        self,
        parameter_1,

):
    self.parameter_1 = parameter_1
    self.parameter_2 = parameter_2
test_cases_values = {
    "friendly_case_name_1": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
    "friendly_case_name_2": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
}
BROWSERS = [
    "('browser_1', SERVER_URL)",
    "('browser_2', SERVER_URL)"
]
class Environment(object):

    def __init__(self, url=URL, port=PORT):
        self.url = url
        self.port = port

    def __name__(self):
        return self.url + ":" + self.port

ENVIRONMENT = Environment()
collected # items <Module 'tests.py'> <Class 'TestClass'> <Instance '()'> <Function "test_function[environment0-test_object0-('browser_1', GRID_SERVER)]"> <Function "test_function[environment1-test_object1-('browser_2', GRID_SERVER)]"> <Function "test_function[environment2-test_object2-('browser_1', GRID_SERVER)]"> <Function "test_function[environment3-test_object3-('browser_2', GRID_SERVER)]"> 我的浏览器连接到网格服务器,我将它们列成如下列表:

class TestObject(object):

def __init__(
        self,
        parameter_1,

):
    self.parameter_1 = parameter_1
    self.parameter_2 = parameter_2
test_cases_values = {
    "friendly_case_name_1": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
    "friendly_case_name_2": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
}
BROWSERS = [
    "('browser_1', SERVER_URL)",
    "('browser_2', SERVER_URL)"
]
class Environment(object):

    def __init__(self, url=URL, port=PORT):
        self.url = url
        self.port = port

    def __name__(self):
        return self.url + ":" + self.port

ENVIRONMENT = Environment()
collected # items <Module 'tests.py'> <Class 'TestClass'> <Instance '()'> <Function "test_function[environment0-test_object0-('browser_1', GRID_SERVER)]"> <Function "test_function[environment1-test_object1-('browser_2', GRID_SERVER)]"> <Function "test_function[environment2-test_object2-('browser_1', GRID_SERVER)]"> <Function "test_function[environment3-test_object3-('browser_2', GRID_SERVER)]"> 我将目标环境存储在一个配置文件中,该文件是一个对象的实例化,如下所示:

class TestObject(object):

def __init__(
        self,
        parameter_1,

):
    self.parameter_1 = parameter_1
    self.parameter_2 = parameter_2
test_cases_values = {
    "friendly_case_name_1": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
    "friendly_case_name_2": TestObject(
        "parameter_1_value",
        "parameter_2_value"
    ),
}
BROWSERS = [
    "('browser_1', SERVER_URL)",
    "('browser_2', SERVER_URL)"
]
class Environment(object):

    def __init__(self, url=URL, port=PORT):
        self.url = url
        self.port = port

    def __name__(self):
        return self.url + ":" + self.port

ENVIRONMENT = Environment()
collected # items <Module 'tests.py'> <Class 'TestClass'> <Instance '()'> <Function "test_function[environment0-test_object0-('browser_1', GRID_SERVER)]"> <Function "test_function[environment1-test_object1-('browser_2', GRID_SERVER)]"> <Function "test_function[environment2-test_object2-('browser_1', GRID_SERVER)]"> <Function "test_function[environment3-test_object3-('browser_2', GRID_SERVER)]"> 然后,我有一个测试类,它创建了一个这样的测试用例列表——测试对象参数实际上是允许自生成代码的字符串。当我将它们作为更广泛的exec语句的填充传递时,我过于简单化了:

class TestClass(object):

    cases = {"test_function": []}
    for i in test_cases.values():
        for j in BROWSERS:
            cases["test_function"].append(
                dict(
                    browser=j,
                    environment=ENVIRONMENT
                    test_object=i
                )
            )

    @pytest.mark.run()
    def test_function(
        self,
        browser,
        environment,
        test_object
    ):
        exec(test_object.parameter_1)
        exec(test_object.parameter_2)
        assert my_assertion
收集器运行时,如下所示: collected # items <Module 'tests.py'> <Class 'TestClass'> <Instance '()'> <Function "test_function[environment0-test_object0-('browser_1', GRID_SERVER)]"> <Function "test_function[environment1-test_object1-('browser_2', GRID_SERVER)]"> <Function "test_function[environment2-test_object2-('browser_1', GRID_SERVER)]"> <Function "test_function[environment3-test_object3-('browser_2', GRID_SERVER)]"> 收集的物品

我想让收集器以这样一种方式工作,即我可以获取关于每个项目的有用信息——我在不同的地方设置了_str___;、_repr__;和__name__;方法,但没有得到我期望的结果。我希望能够将此应用到报告中—在生产中会生成200多个测试,我必须跟踪当前的堆栈跟踪,以准确地找出每个故障的测试内容


我不确定我在哪里犯了错误,我应该修改pytest_generate_测试的实现,还是修改创建TestClass的方式,或者以不同的方式设置案例?理想情况下,我希望能够通过ORM映射回包含测试元数据的内容。

好吧,我想出来了。原来metafunc.parametrize函数接受“ids”作为参数。我所要做的就是定义我想要命名的对象的_repr___;,并扩展列表理解,这样我就可以从同一个循环返回两个东西

def pytest_generate_tests(metafunc):
    funcarglist = metafunc.cls.cases[metafunc.function.__name__]
    argnames = list(funcarglist[0])
    argvalues = []
    ids = []
    for i in funcarglist:
        inner_argvalues_list = []
        inner_ids_list = []
        for j in argnames:
            inner_argvalues_list.append(i[j])
            if type(i[j]) != str:
                inner_ids_list.append(i[j].__repr__())
            else:
                inner_ids_list.append(i[j])
        argvalues.append(inner_argvalues_list)
        ids.append(inner_ids_list)
    metafunc.parametrize(argnames, argvalues, ids=ids)

看看这个,可能有用