Pytest环境准备与入门

为什么要学习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环境准备与入门

根据标签名过滤用例的前提是能让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__。

相关文章: