pytest的第一个程序:
def test_passing():
assert (1,2,3) == (1,2,3)
在这里test_one.py后方的一个点号(.)表示:你运行了测试用例,且通过了测试
或者也可以使用pytest -v test_one,具体执行记录如下图:
下面我们接着看,执行如下代码:
def test_failing():
assert (1,2,3) == (3,2,1)
又会发生什么现象呢
那必须是失败啊 ,至于为啥会失败,那肯定和预期值不一致呗。为什么在这里举这个例子呢,就是想说他能直白,好运行,容易上手,失败的时候也能给出清晰的报错原因。
不好意思,在这里使用的assert(1,2,3) == (1,2,3)这个无聊的例子。
pytest安装:
一、安装
1)新建项目,在PyCharm上进行安装pytest即可
2)pip install-U pytest
pip3 install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
安装方法贼简单,这里就说了,直接cmd里面运行执行就好
运行pytest:
from collections import namedtuple
Task = namedtuple('Task',['summary','owner','done','id'])
Task.__new__.__defaults__=(None,None,False,None)
def test_defaults():
t1 = Task()
t2 = Task(None,None,False,None)
assert t1 == t2
def test_member_access():
t = Task('buy milk','brian')
assert t.summary == 'buy milk'
assert t.owner == 'brian'
assert (t.done,t.id) == (False,None)
Task.__new__.__defaults__
这个意思就是创意默认的Task对象,没必要指定所有的属性。
在test_defaults演示了默认值的校验。
from collections import namedtuple
Task = namedtuple(‘Task’,[‘summary’,‘owner’,‘done’,‘id’])
Task.new.defaults=(None,None,False,None)
def test_asdict():
t_task = Task(‘do something’,‘okken’,True,21)
t_dict=t_task._asdict()
expected = { ‘summary’: ‘do something’, ‘owner’: ‘okken’, ‘done’:True, ‘id’: 21}
assert t_dict == expected
``def test_replace():
t_before = Task (‘finsh book’,‘brian’,False)
t_after= t_before._replace(id=10,done=True)
t_expeccted = Task(‘finsh book’,‘brian’,True,10)
assert t_after==t_expeccted
在上面中使用了._asdict(),意思就是:使用_asdict()方法可以将一个namedtuple对象转换为一个orderdict字典
第二个断言是使用了._replace()把里面的值换成自己需要的值
pytest用例运行的肤浅的原理
为什么是肤浅的原理的呢,那是因为这是我理解的,所以就肤浅了。
假设有4个Py文件,分别在如下目录
ch1/test_one.py
ch1/test_two.py
ch1/task/test_three.py
ch1/task/test_four.py
在运行pytest的时候,我们是可以指定目录和文件的。如果我们不指定的话,pytest就会搜索当前目录及其子目录以test_开头或者以_test结尾的测试函数。假设我们切换到ch1目录下运行,就会目录下的4个测试文件。
我们把pytest搜索文件和测试用例的过程叫做测试搜索。我们按照人家规定的规则,就会自动的搜索待执行的文件。
如果我们编写新的用例,那么可以在pytest中指定需要测试的文件名或目录,或者预先切换到需要运行的目录。
下面我们说运行运行单个测试文件在控制台输出的信息
在搜索范围内找到两条测试项目
pytest会为每个session做出明确的分割,一段会话pytest就会调用一次,
上图中three.py表示测试文件,每个文件的测试状况都占据一行,两个点表示两个测试用例均已经通过。点仅仅表示通过而已,而Failture(失败),error(异常),skip(跳过),xfail(预期失败),xpass(预期失败但通过)会被标记为F,E,S,x,X,说着使用-v也可以查看更过细节把。
pytest常用命令
指令可能会有很多,对于我们这些小白,掌握这些应该绰绰有余
–collect -only
用来展示给定的配置下有哪些测试用例会被运行。好处就是可以在你测试之前,检查选中的用例是不是符合预期。
-k
-k就是允许使用表达式指定希望运行的测试用例,这个功能吧,感觉比较实用。打个比方,多个测试名下的前缀或者后缀一样的,那么就可以实用表达式快速定位。假设希望选中test_asdict()和test_defaults(),那么就可以实用–collect-only验证筛选的情况。
看起来上面的运行很符合我们的预期,那么现在我们再把–collect-only去掉再去运行
从上面运行的结果我们可以很清楚的看到他们都通过了。那么又出现一个疑问,就是他们复合我们的预期吗?,这是我们就可以实用-v查看
上图一看,很好,两个都验证通过了
-m
用于标记测试并分组,方便我们快速选中并运行。他们可能在不同的文件里,如果希望同时选中他们,就可以先做好标记
举个例子吧,假设我们使用run_these_please,就可以实用@pytest.mark.run_these_please这样的装饰器来进行标记
-x
正常情况下,pytest会运行每一个搜索到的测试用例,如果某一个被断言失败,或者异常,该测试用例的运行就会停止,pytest将其标记为失败后会继续运行下一个测试用例。通常,这就是我们期望的运行模式,但是呢,在遇到debug时候,我们希望遇到失败后立即停止会话,这是我们-x就可以隆重出场了。
我们发现在末尾显示有5个pass,1个failed。Interrupted提示我们中断了。
如果我们运行的时候,即使遇到异常也不想终止运行,继续执行吧所有手机到的测试条目全部执行完成。实用pytest --tb=no就可以达到我们想要的效果。
–maxfail=num
上面说了-m的特点就是,一旦我们遇到了失败,就会全局停止,当然我们还可以设置pytest在运行了几次后再停止,则可以实用–maxfail选项,明确指出失败几次。
如果我们设置–maxfail=2就代表,失败两次后就会停止。maxfail=1,就代表失败1次后就会停止运行。这时我们发现和-x的效果是一样的
-s与–capture=method
-s选项允许终端在测试运行时输出某些结果,包括任何复合物标准的输出流信息,-s等给于–capture=no。正常情况下素有的测试输出都会被捕获。测试失败时,为了帮助推断为什么失败,pytest就会做出推断,并输出报告。
–If(–last-failed)选项
当我们遇到一个或者多个失败时候,我们常常希望能够定位最后一个失败的测试用例重新运行,这时可以使用–If选项。
–ff(–last-failed)选项![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9061f245d4dd3ce3b3b9d5249845eb8b.png)
–ff和–If用法差不多,不同的是–ff会运行结束剩余的测试用例。由于test_failing是在test_four.py之后运行但在–ff的作用下,test_failing前一轮 被认定为位失败,会被首先执行
–v(–verbose)选项
使用-v,输出的信息会更详细。最最明显的区别就是每个文件的每个测试用例都占用一行,测试的名字和结果都会显示出来。在显示器上可以看到FAILED标记为红色,PASSED标记为绿色。
–q(–quiet)选项
正好与-v相反,他会简化输出信息。只保留核心的内容
-l(–showlocals)选项
使用-l,失败测试用例由于被对堆栈跟踪,所以全局变量及其值都会显示出来
在assert断言失败后,代码片段会限制本地的变量
t_after,t_before,t_before详细的值。
–tb=style 选项
就是捕捉到失败输出信息的显示方式是啥样儿的,打个比方吧,pytest在执行用例的时候,失败了,是哪行整失败的,为什么失败呢,怎么就能失败呢,这个过程专业术语叫“信息回溯”。在我们回溯的时候,发现有些多余的信息使我们不想要的,这时候我们的–tb=style选项就有了用武之地,
其实,后面的style他是个类型,他手底下有三个常用模式随你切换,分别是,short,line,no
还有三个不常用的,我管他们三个叫备胎,分别是:long,auto,native
short模式就是他仅仅输出assert的一行和系统判定的内容,你是pass还是fail。不跟你多bb,言简意赅
line模式,模式只是用一行显示所有的错误信息
no模式直接屏蔽全部的回溯信息
三大备胎
long输出最最详细的回溯信息,其实我们的这个指令还不如-l命令来的实在
auto就是默认值,如果有好多个失败的用例,仅仅打印第一个和最后一个。
native只输出python标准库的回溯信息,不展示额外的信息
–duration=N 选项
这个就是加快你测试的节奏,这是就会不关系测试时如何运行的了,值统计测试过程中哪几个阶段是最慢的。当duration=0,就会将所有阶段耗时从长到短排序后展示。
–version 选项
显示当前使用pytest版本及其安装目录
-h 选项
这个命令就是展示pytest的用法,当然也可以展示新添加的插件的选项和用法。
总结
好了,学完了,主要的收获pytest的获取和执行的方式。常看!常用!常记!