龙空技术网

pytest框架进阶自学系列 | argvalues参数

热爱编程的通信人 23

前言:

而今你们对“计算器arg什么意思”大概比较重视,你们都想要知道一些“计算器arg什么意思”的相关内容。那么小编在网络上网罗了一些关于“计算器arg什么意思””的相关文章,希望看官们能喜欢,朋友们一起来学习一下吧!

书籍来源:房荔枝 梁丽丽《pytest框架与自动化测试应用》

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:pytest框架进阶自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客

参数化中参数值argvalues是一个可迭代对象,表明对argnames参数的赋值,具体有以下几种情况:如果argnames包含多个参数,那么argvalues的迭代返回元素必须是可度量的值,即支持len()方法,并且长度和argnames所声明参数的个数相等,所以它可以是元组/列表/集合等,表明所有入参的实参。

代码如下:

import pytest@pytest.mark.parametrize('input, expected', [(1,2),[2,3],set([3,4])])def test_sample4(input, expected):    print(expected)    assert input + 1 == expected

执行结果如下:

import pytest@pytest.mark.parametrize('input, expected', [(1,2),[2,3],set([3,4])])def test_sample4(input, expected):    print(expected)    assert input + 1 == expected
argvalues来源于Excel文件

argvalues是一个可迭代对象,所以可以应用在更复杂的场景中,这在实际应用中被特别广泛使用。公司一般会将测试数据保存在Excel表中,或csv文件中,或数据库中。可以先将数据读取到列表中,这样便可以在参数化的参数值中直接调用。例如:从Excel文件中读取实参。

代码如下:

import pytestdef read_excel():    for dev in ['dev1', 'dev2', 'dev3']:        yield dev        @pytest.mark.parametrize('dev', read_excel())def test_sample(dev):    assert dev
D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_test.pyTesting started at 14:27 ...Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_test.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4============================= test session starts =============================platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.execachedir: .pytest_cacherootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-bookcollecting ... collected 3 itemstest_test.py::test_sample[dev1] PASSED                                   [ 33%]test_test.py::test_sample[dev2] PASSED                                   [ 66%]test_test.py::test_sample[dev3] PASSED                                   [100%]============================== 3 passed in 0.01s ==============================Process finished with exit code 0

实现这个场景有多种方法,也可以直接在一个fixture中加载Excel文件中的数据,但是它们在测试报告中的表现会有所区别。

使用pytest.param为argvalues赋值

在结合pytest.param方法对skip和xfail标记中,可以使用pytest.param为argvalues参数赋值,让执行有更详细说明。

代码如下:

import pytest@pytest.mark.parametrize(    ('n', 'expected'),    [(4,2),     pytest.param(6, 3, marks=pytest.mark.xfail(), id='XPASS')])def test_params(n, expected):    assert n / 2 == expected

执行结果如图4-1所示。

把上面计算器的例子修改一下,如果将具体数据执行分成不同结果,则可以采用pytest.param实现。

D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_mark_param_sub.pyTesting started at 14:31 ...Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_mark_param_sub.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4============================= test session starts =============================platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.execachedir: .pytest_cacherootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-bookcollecting ... collected 2 itemstest_mark_param_sub.py::test_params[4-2] PASSED                          [ 50%]test_mark_param_sub.py::test_params[XPASS] XPASS                         [100%]======================== 1 passed, 1 xpassed in 0.01s =========================Process finished with exit code 0

代码如下:

import pytest@pytest.mark.parametrize("test_input, expected", [("3+5", 8),                                                  ("2+5", 7),                                                  pytest.param("6*9", 42, marks=pytest.mark.xfail)])def test_eval(test_input, expected):    assert eval(test_input) == expected

执行结果如下:

D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_mark_param_sub.pyTesting started at 14:33 ...Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-4/test_mark_param_sub.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4============================= test session starts =============================platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.execachedir: .pytest_cacherootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-bookcollecting ... collected 3 itemstest_mark_param_sub.py::test_eval[3+5-8] PASSED                          [ 33%]test_mark_param_sub.py::test_eval[2+5-7] PASSED                          [ 66%]test_mark_param_sub.py::test_eval[6*9-42] XFAIL                          [100%]test_input = '6*9', expected = 42    @pytest.mark.parametrize("test_input, expected", [("3+5", 8),                                                      ("2+5", 7),                                                      pytest.param("6*9", 42, marks=pytest.mark.xfail)])    def test_eval(test_input, expected):>       assert eval(test_input) == expectedE       assert 54 == 42E         +54E         -42test_mark_param_sub.py:7: AssertionError======================== 2 passed, 1 xfailed in 0.03s =========================Process finished with exit code 0

下面探究原理,实际使用者可以略看。

无论argvalues中传递的是可度量对象(列表、元组等)还是具体的值,在源码中都会将其封装成一个ParameterSet对象,它是一个具名元组(namedtuple),包含values、marks、id 3个元素,代码如下:

如果直接传递一个ParameterSet对象会发生什么呢?下面去源码里找答案。

源码如下:

可以看到,如果直接传递一个ParameterSet对象,那么返回的就是它本身(return parameterset),所以下面例子中的两种写法是等价的。

查看到这里,或许你已经猜到了,pytest.param的作用就是封装一个ParameterSet对象。我们去源码里求证一下吧!

源码如下:

正如上面所料,现在你应该更明白怎么给argvalues传参了。

标签: #计算器arg什么意思