pytest自学第二期

摘要:
好了,现在开始学习pytest第2章。pytest 2.1的基本用法通过python解释器调用pytest。在控制台上输入命令:python-mpytest文档表示,此方法相当于直接调用pytest,唯一的区别是,调用会将当前目录添加到sys.path2.2退出代码退出代码方便我们看到pytest有以下六个退出代码:退出代码0:查找所有测试用例并通过退出代码1测试用例:查找并运行测试用例,但有些测试用例失败Exitcode2:用户中断了测试Exitcode3:执行过程中发生内部错误Exitcode4:pytest命令行使用了错误Exitcode5:找不到任何人什么测试用例?如何查看退出代码?答案是肯定的。你还记得pytest吗。ini文件?
好,现在开始学习pytest第二章2 pytest初级用法

2.1 通过python解释器调用 pytest

在控制台输入命令:   python -m pytest 文档说这种方式相当于直接调用 pytest,唯一的不同是这样调用会把当前目录添加到sys.path (这句是重点,重点是啥,我不知道,   我不知道这有什么用c 以后就这样,如果有自己学过但是不知道的东西,就挂在那里晒着鞭尸,一直不会就一直鞭尸,直到自己参透了其中的道理再回到这里补全)

pytest自学第二期第1张

2.2 退出码

退出码方便我们看报告

pytest有以下6种退出码:

Exit code 0: 找到所有测试用例并测试通过

Exit code 1: 找到测试用例并运行但是部分测试用例运行失败

Exit code 2: 用户中断了测试

Exit code 3:执行过程中发生了内部错误

Exit code 4: pytest命令行使用错误

Exit code 5: 没有找到任何测试用例

如何查看退出码?

这个要在第三期我们才可以知道,可以在python代码中运行pytest

pytest.main() # main()括号内可以添加参数  ['参数1','参数2']

  

添加代码后,运行python文件就相当于在控制台输入pytest,  重要的是,运行此代码会返回pytest的退出码

pytest自学第二期第2张

 

 返回了退出码ExitCode.OK

这个退出码是pytest的一个枚举类中的一个值,我们怎么知道 这个.OK代表着什么意思呢?

那我们找到这个枚举类看一下里面的内容就知道了

我们首先知道是 main()这个方法运行后返回的退出码,那么 main()方法一定是有这个返回值的,所以我们 Ctrl+鼠标左键,点击   main()方法

pytest自学第二期第3张

 

 这样我们就进入了main()方法内部,然后再用同样方法进入他的返回值看一看

pytest自学第二期第4张

 

 

pytest自学第二期第5张

 

 

这样我们就找到了这个枚举类,可以看到这些常量对应的值012就是我们上面说的那些值

 pytest自学第二期第6张

 

 我们也可以在运行时直接以int方式输出退出码,这样就可以直接查看退出码的值了

补充一下,int输入有点野路子有点LOW,本身枚举类就提供.value的方法了,可以直接  print(exit_code.value)输出具体值   U•ェ•*U

 pytest自学第二期第7张

 

 

2.3重试次数

pytest ‐‐maxfail=2 # 第2次测试失败后停止测试

  

2.4 指定/选择测试用例

现在要学习使用多种方法选择我们的测试用例,因为后续继承 jinkens后肯定是需要用户可以自动选择用例,然后调用pytest的命令运行指定的用例,所以说,需要我们能灵活运用命令运行我们想要运行的用例

2.4.1:文件篇,如何选择我们想要运行的文件

pytest test_mod.py # 使用该命令,即可随意指定文件,运行我们想要的文件

  

如果我想指定多个文件怎么办?

pytest test_mod.py test_mod2.py # 注意用空格分隔

  

如果我不想一个一个写文件名,我想运行某一个目录中的全部文件

pytest testing/

  

我又不想运行目录中全部的文件了,我只想运行目录中部分文件

那我们可以使用 -k关键字进行测试

pytest自学第二期第8张

pytest自学第二期第9张

 

还是同样的例子,如果我想运行  前三个文件呢,  这时 "_s"  就不够用了吧

没关系,我们可以使用  or 关键字

pytest自学第二期第10张pytest自学第二期第11张

 同理  我们还可以使用  and 关键字 和 not 关键字

pytest自学第二期第12张

 

 pytest自学第二期第13张

 

 

不过即使是这样,可能有人依然不满足,你这样的话我如果使用jinkens集成,可能必要时候需要我前台选择用例,后台自动生成一个运行命令以运行相应的用例,我不能生成出来一个这样的类似正则的命令啊,这个 -k 命令可能只便捷与手动运行命令的人(而且还需要他用脑袋去想匹配规则,甚至要在事先规范化文件名才有明显效果),而对于有生成命令需求的人用 -k 目前觉得可能不太现实

 目前是只有这些方法,后期再看看还能不能整整花活pytest自学第二期第14张

 

 

2.4.2:用例篇,我如何控制我文件中想要运行的用例

我已经知道了用  pytest xx.py 这类的命令 控制运行我想要运行的文件了,但是现在如果我想要运行的文件内有多个用例,但是我只想运行其中的一部分用例怎么办?当然我可以将我不想运行的用例代码注释掉,但是我觉得可能有更好的办法让我实现这种操作

pytest自学第二期第15张

 

 

 pytest自学第二期第16张

 

 举一反三,我是否能用 -k 参数筛选我想要运行的用例?

pytest自学第二期第17张

 

 

 

我想整活,我发现我使用 -k 关键字匹配到了我想要的大部分用例,但是有一个用例不适用于我写的规则所以不能匹配到,但是我依然想让它一起运行,  所以我是不是可以在 -k 参数后,再手动添加一个我想要运行的用例?

pytest自学第二期第18张

 

 

 pytest自学第二期第19张

 

那这样看来,可能pytest 使用了 -k搜索的集合作为最后的结果集,不能手动在继续添加其他的内容(在运行-k前先添加也不行),虽然命令没有报错,  暂时时间关系我不想再继续深挖,后续集成时再继续深挖探索

 

那我不爽了,我就是个眼大肚子小的人,虽然工作拧螺丝,看文档我偏要造原子弹,就算以后项目可能用不到这样复杂的命令,但是你今天告诉我不支持,我就是觉得少了块东西,有一种残缺的不安全感

好消息是,pytest还有一种方法可能满足这种需求 :装饰器

 

pytest ‐m slow  # 这种方式会运行所有通过装饰器 @pytest.mark.slow进行装饰的测试用例。

  

# python 代码如下
import pytest class Test_slow(object): def test_1(self): a = 'xx' assert "x" in a @pytest.mark.slow def test_2(self): a = 'xx' assert "s" in a

  

注意,因为你使用了pytest的mark标记功能,如果你的项目目录没有 pytest.ini文件,请先自己手动建立一个该文件并填入如下代码

[pytest]
markers = slow: 冒号后为注释,可选非必填

  

此时运行命令,应该只运行有 slow修饰的 test_2 用例了,  test_1因为没有修饰所以不会运行

pytest自学第二期第20张

 

如图所见,你这个装饰器是给方法加的,能不能给类加一个呢,这样我就可以涵盖整个类的用例了

答案是可以的,看我操作一下

pytest自学第二期第21张

 

pytest自学第二期第22张

 

 

 pytest自学第二期第23张

 

有点意思,不过我依然有问题,你这里只是提到了用 slow修饰,这种东西到底有几个啊,我有个项目的用例可以分成若干个种类,你这个就一个不够用怎么办?能搞自定义的吗?

答案是能搞,还记得前面的那个  pytest.ini文件吗?

直接在后面添加就可以了

pytest自学第二期第24张

 

除了用 pytest.int文件配置外, 你甚至可以修改pytest的源码实现这个需求

官方在文档中也提到了这个方式,但是我觉得可以但是没有必要,理由如下:

1.改源码并不比配置文件方便,且配置文件本身不麻烦

2.修改源码会破坏pytest的内容,完全没有必要担负这个风险,后续如果pytest更新能否会覆盖你所添加的自定义内容暂且不提,pytest如果更新肯定也是优先适配配置文件类型的,这种修改源码的自定义能容能否受到影响就是不确定的风险了

3.git提交费劲,你如果修该了源码那你就必须git提交你的修改以便让其他人适用,而别人想要自定义考虑到统一性也要在pytest源码中添加他的自定义且git提交给你,首先大家同时修改一个主要框架的源码就是一件很奇葩的设定,且大家的代码风格可能还不一样,而且万一发生了上一条的风险那处理起来就是多环境的问题简直噩梦

4.修改起来不方便,pytest.ini就在项目目录,没必要每次添加都去找pytest的源代码去修改,且找到源代码还要找到相应的位置去添加,个人觉得实在没有必要,至少这个需求没有必要这样做,除非你不想让别人知道你自定义的地方在哪里故意藏在这里,或者就是想让别人看的一脸懵逼

5.这种做法相当于用笔纸就能记录的一个手机号,你却偏要把它纹身到身体上

首先进入这个文件

pytest自学第二期第25张

 

 

 ctrl+f搜索  addinivalue_line,   然后打开编辑权限,在图中红线处添加代码

这个我必须要说一下,文档中只是说可以这样添加,但是没有说怎么添加,我加了半天以为第一个参数是  自定名称,第二个参数是描述,弄了半天才知道 第一个参数"markers"固定写法,代表你要添加一个markers,后面参数写自定义名称和描述

pytest自学第二期第26张

 

调用命令

pytest自学第二期第27张

 

 2.4.3另外一提,这个我实在没有搞懂怎么用

pytest自学第二期第28张

 

 

第二期自己也学费了,我也只是停留在摸索阶段,后续有时间会将自己的一些新的想法和理解补上,不敢当别人老师,希望能给别人提供一点思路就好

 

免责声明:文章转载自《pytest自学第二期》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移动端webapp如何应对不同屏幕尺寸(转)code-server nginx 反向代理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 2.1 源码结构分析

Android 2.1   |-- Makefile   |-- bionic (bionic C库)   |-- bootable (启动引导相关代码)   |-- build (存放系统编译规则及generic等基础开发包配置)   |-- cts (Android兼容性测试套件标准)   |-- dalvik (dalvik JAVA虚拟机)   |-...

linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行

为什么ssh断开后你运行的进程会退出呢? 因为所有进程都得有个父进程。当你ssh到一个服务器上时,打开的shell就是你所有执行命令的父进程。 当你断开ssh连接时,你的命令的父进程就没了。如果处理不当,这些进程就会收到SIGTERM信号,全被干掉了。 然后说解决方案: 让你运行的进程的父进程变成PID=1的init进程,这样你的shell退出后不影响这...

码云客户端Gitee使用2 下载项目

码云上面有许多优秀的开源项目,非常感谢这些组织、公司、团队以及个人的开源精神以及为开源项目长期付出的的艰辛。举手之劳,Star一下! NetModular是一个非常优秀的开源项目,她是基于.Net Core和 Vue.js 的业务模块化以及前后端分离的快速开发框架。码云地址为:https://gitee.com/laoli/NetModular 选择一个好...

如何调试没有源码的.Net程序

在.Net开发过程中,经常会使用一些没有源码的第三方库,在代码出了问题时,如果怀疑跟该库的内部实现有关,我们该怎么办呢?首先,自然会想到反编译去看看代码或者联系作者,然而,有没有办法让我们在debug时进入这个第三方库,并看看里面在运行时到底发生了什么呢?本文就来介绍三种debug第三方库的办法,希望能够对你有所帮助。 先介绍一下我们的样例代码,下面这段代...

使用sourceMap文件定位小程序错误信息

sourceMap是什么 在前端开发过程中代码难免会有错误,即便是再小心,也有可能出现 Cannot read property 'xxx' of null 这样的低级失误,debug自然是家常便饭。如何使用chorme的控制台进行debug也有许多技巧,但本文的关注点不在此,不予讨论。 在使用构建工具时,sourceMap相相信大多数人都见过,也知道we...

1、Dubbo源码解析--Dubbo如何驱动Spring IOC容器并配合工作的?

首先Spring要注入自己的bean需要在Spring-provider.xml(提供者spring注入文件,名字可能不一样)添加bean注入,其中有dubbo的自定义标签,xml如何识别这些标签?拿到标签如何注入到Spring Container?一般需要如下几个步骤:   1)、设计配置属性和JavaBean     设计属性即dubbo.xsd中的a...