前言:
而今你们对“计算器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 == expectedargvalues来源于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什么意思