1、引言
我有一个朋友是做Python自动化测试的。前几天他告诉我去参加一个大厂面试被刷了。
我问他是有没有总结被刷下来的原因。他说面试官问了一些 pytest 单元测试框架相关的知识,包括什么插件系统和用力筛选。但是他所在的公司用的技术是基于 unittest 的,没有用过 pytest。
我跟他说你可以和技术面试官说明,在实际过程当中你没有使用过 pytest,但是你可以后面再学。这哥们说:我就是这样跟面试官说的,但是面试官告诉我 pytest 现在已经是行业里面的主流,还在坚持用 unittest 说明我的技术已经过时了,没有跟上现在测试领域的发展。
实际上他在面试之前已经了解过 pytest 的一些基础用法,但是网上的一些资料,都是停留在用法和一些知识点的讲解,没有深入到 pytest 内部运行和一些高级特性。所以被问到的时候,自己临时抱佛脚的一些知识都没有用上。
后面我给这位朋友补习了一些关于Python的高级特性。现在我连同基础部分的内容一起贴出来,希望对Python自动化测试的一些朋友有所帮助。
2、为什么用单元测试框架?首先我要说明一下什么是单元测试框架?
unittest 和 pytest 都是单元测试框架。单元测试指的是在编程过程当中形成的对函数或者是类下面的方法进行测试的一个过程。
在不使用任何框架的前提下,其实也是可以进行单元测试的。比如我们可以通过 if 判断 、异常处理或者是其他的流程控制来表示测试是否通过。
def add(a, b):return a + b
def test_add():
ret = add(3, 4)
if ret == 7:
print("add 函数的测试通过")
else:
print("add 函数的测试失败")
如果要运行这个用例,需要手工调用 test_add 这个函数:
test_add()接下来,使用 python 运行这个文件,就能得到测试结果:
python test_add.py虽然说上面我们通过 if 判断,对一个函数进行了测试,而且得到了测试结果,但是流程是比较复杂的:
首先我们需要人工去判断结果,
第2我们需要通过 Python去运行模块。
第3,我们还需要显性的去调用 test_add 这个函数。
这还只是在我们只测试了一个函数的情况下,当需要测试的函数或者类越来越多的时候,这个过程会越来越复杂。
而使用单元测试框架,可以极大的简化我们对单元测试的过程,使用单元测试框架以后,框架会帮我们自动去收集用例、运行用例、生成报告。
3、pytest 的基础使用
上面的测试代码使用 pytest 编写,可以这样写。
def add(a, b):return a + b
def test_add():
assert 7 == add(3,4)
写完测试用例以后,我们只需要在目录下输入pytest 指令,就可以自动运行用例,而且呢结果会直接显示在命令行的下方。
上面讲的是单元测试过程,也就是说对某个函数或者是类下面的方法进行测试,有的人可能会不理解。在实际工作过程当中很少进行单元测试啊,测试人员做的更多的是接口测试,UI测试,pytest 怎么用呢?
实际上不管是接口测试还是UI测试,都是可以使用 pytest。当你进行接口测试的时候,你只需要把访问接口的过程封装成一个Python函数。
def visit_api():print("访问接口,得到结果...")
return response
def test_api():
assert expected_response == visit_api()
当你进行 web测试的时候,你只需要操作浏览器的过程封装成一个函数?
def browser_method():print("点点点")
return ui_response
def test_web():
assert expected_response == browser_method()
在这种情况下。接口访问和web操作都是以函数形式存在的,我们直接去测试这个 Python 函数,也是一个单元测试的过程。
因为 pytest 是一个第三方的框架,所以我们先要安装。安装方式非常简单,只需要通过 pip 这个包管理工具安装就可以了。
pip install -U pytest安装完成以后,我们可以向使用上面的那个例子一样:
第1步:定义一个测试函数,这个测试函数通常会调用被测函数。