包含python如何测试函数的词条( 二 )


另外,此时 , 在输出的控制台中,还无法打印出 reason 信息,如果需要打印 , 则可以在配置文件中的 addopts 参数的 -s 变为 -rs :
如果我们事先知道测试函数会执行失败,但又不想直接跳过,而是希望显示的提示 。
Pytest 使用pytest.mark.xfail 实现预见错误功能::
需要掌握的必传参数的是:
那么关于预期失败的几种情况需要了解一下:
结果如下:
pytest 使用x表示预见的失败(XFAIL) 。
如果预见的是失败,但实际运行测试却成功通过 , pytest 使用X进行标记(XPASS) 。
而在预期失败的两种情况中 , 我们不希望出现预期失败,结果却执行成功了的情况出现,因为跟我们想的不一样嘛 , 我预期这条用例失败,那这条用例就应该执行失败才对 , 你虽然执行成功了,但跟我想的不一样,你照样是失败的!
所以,我们需要将预期失败,结果却执行成功了的用例标记为执行失败,可以在pytest.ini 文件中,加入:
这样就就把上述的情况标记为执行失败了 。
pytest身为强大的单元测试框架,那么同样支持DDT数据驱动测试的概念 。也就是当对一个测试函数进行测试时,通常会给函数传递多组参数 。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码 。
当然,我们可以把这些参数写在测试函数内部进行遍历 。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败,测试也就终止了 。
通过异常捕获,我们可以保证程所有参数完整执行,但要分析测试结果就需要做不少额外的工作 。
在 pytest 中,我们有更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试 。使用的工具就是pytest.mark.parametrize(argnames, argvalues)。
使用就是以装饰器的形式使用 。
只有一个参数的测试用例
来看(重要部分)结果::
可以看到 , 列表内的每个手机号,都是一条测试用例 。
多个参数的测试用例
(重要部分)结果:
可以看到,每一个手机号与每一个验证码都组合一起执行了,这样就执行了4次 。那么如果有很多个组合的话,用例数将会更多 。我们希望手机号与验证码一一对应组合 , 也就是只执行两次,怎么搞呢?
在多参数情况下,多个参数名是以, 分割的字符串 。参数值是列表嵌套的形式组成的 。
固件(Fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们,也称测试夹具 。
我们可以利用固件做任何事情,其中最常见的可能就是数据库的初始连接和最后关闭操作 。
Pytest 使用pytest.fixture()定义固件,下面是最简单的固件,访问主页前必须先登录:
结果:
在之前的示例中,你可能会觉得,这跟之前的setup和teardown的功能也类似呀,但是,fixture相对于setup和teardown来说更灵活 。pytest通过scope 参数来控制固件的使用范围,也就是作用域 。
比如之前的login固件,可以指定它的作用域:
很多时候需要在测试前进行预处理(如新建数据库连接),并在测试完成进行清理(关闭数据库连接) 。
当有大量重复的这类操作,最佳实践是使用固件来自动化所有预处理和后处理 。
Pytest 使用yield关键词将固件分为两部分,yield之前的代码属于预处理,会在测试前执行; yield之后的代码属于后处理,将在测试完成后执行 。
【包含python如何测试函数的词条】以下测试模拟数据库查询,使用固件来模拟数据库的连接关闭:

推荐阅读