为什么要学习pytest?在这之前大家如果接触过框架,应该用的最多的就是unittest框架了,或者框架都没有接触过,就是纯脚本。
另外学习pytest的话绝对会在简历上加分。
附送一条py学习的鄙视链:
pytest 鄙视 > unittest 鄙视 > robotframework 鄙视 > 记流水账 鄙视 > “hello world”小白 > 小手点点点
pytest是个测试框架,至于冒烟(保证主流程通的)+回归(正常用例/异常用例,尽可能覆盖全面一些)。
pytest 简介
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。
根据pytest的官方网站介绍,它具有如下特点:
▶非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
▶能够支持简单的单元测试和复杂的功能测试
▶支持参数化
▶执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
▶支持重复执行(rerun)失败的case
▶支持运行由nose, unittest编写的测试case
▶可生成html报告
▶方便的和持续集成工具jenkins集成
▶可支持执行部分用例
▶具有很多第三方插件,并且可以自定义扩展
pytest和unittest区别: …
选择200条用例用来Web自动化,那么就是200条用例回归,选多少条用例进行冒烟?
加入冒烟的用例从几个添加到几十个,就要手工修改很多次,unittest没有提供机制的选用例的功能。
如果是pytest的话,用一个标记功能就可以实现。比如一个模块中,未来还会增加更多的测试用例,但是只要任务是冒烟的用例,就在前面加个标记,在运行的时候指明只运行这些带标记的用例。
unittest代码如下 …
#实例化套件对象s = unittest.TestSuite()#TestLoader的用法#1、实例化TestLoader对象# 2、使用discover去找到一个目录下的所有测试用例#3、使用sloader = unittest.TestLoader()s.addTests(loader.discover(testcases_dir))
unittest是自己手机测试用例,收集完了之后再去运行。pytest只要你按照它的规则去写,它自己可以发现。
unittest中的断言是self.assertEqual()。 …
只能用它提供的几种方式。pytest风格更自由,只要后面表达式的结果是true和false就可以,其它不管。所以可以用and not以及其它的运算符。
# 断言asserterrorMsg == data["check"] assert userMoney_afterInvest == userMoney_beforeInvest
结果是true就通过,false就失败。
例如:函数级: …
setUp()和tearDown()属于测试用例级别,只针对每一个测试用例都去做的。
类级:setUpClass()和tearDownClass()是针对测试类去做的。作用域和作用级别不一样。
pytest可以做更高级的模块级别。
模块级:.py文件叫做模块。
会话级:不仅仅是打开浏览器到结束浏览器,而是整个自动化用例运行过程当中,只做一次的事情。右键运行到结束就是整个会话,跟浏览器的会话性质不一样,针对的是测试用例。
如果有100条用例,从开始执行到结束,那就是100条用例只执行一次的操作。
fixtures是pytest的精髓所在,就像unittest中的setup和teardown一样,如果不学fixture那么使用pytest和使用unittest是没什么区别的。
插件提供更多功能…
和allure集成,有html测试报告。
安装好了可以在python路径下看到pytest.exe
输入python--version
根据标签名过滤用例的前提是能让pytest自动识别到测试用例,首先得知道是如何自动发现测试模块和测试方法的?才好继续做后续的工作。
如何收集测试用例?
Pytest - 收集测试用例规则:
1.默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,就从哪个目录当中搜索;
2.搜索规则:
2.1 符合命名规则test_*.py或者*_test.py的文件。
2.2 以test_开头的函数名;
2.3 以Test开头的测试类(没有_init_函数)当中,以test_开头的函数。
以test_开头的函数名,例如:
deftest_demo():pass
以Test开头的测试类(没有__init__函数)当中,以test_开头的函数,例如:
@ddt.ddtclassTestLogin(unittest.TestCase): @classmethoddefsetUpClass(cls):# 前置 - 打开网页。启动浏览器 cls.driver = webdriver.Chrome() cls.driver.get(cd.web_login_url)
有_init_就变成了一个正常的类了,既然是个测试用例就不能写__init__。