Pytest编写测试用例(二)
在前面对Pytest做了大概的概述,本节中主要总结Pytest在编写测试用例方面的的知识体系。在实际的工作中,并不是所有的测试用例都是需要执行的,某些测试用例不想被执行,可以添加一个忽略执行,这地方就会使用到装饰器,如果对装饰器不熟悉的同学可以看看我的函数知识体系里面对装饰器的总结和概述。见如下的案例代码:#!/usr/bin/env python# -*-cod...
在前面对Pytest做了大概的概述,本节中主要总结Pytest在编写测试用例方面的的知识体系。
在实际的工作中,并不是所有的测试用例都是需要执行的,某些测试用例不想被执行,可以添加
一个忽略执行,这地方就会使用到装饰器,如果对装饰器不熟悉的同学可以看看我的函数知识体系
里面对装饰器的总结和概述。见如下的案例代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest @pytest.mark.login def test_login_001(): pass @pytest.mark.login def test_login_002(): pass @pytest.mark.skip(reason='忽略执行该测试用例') def test_login_003(): pass
执行命令pytest -rs,就能够显示出忽略执行的测试用例的详细信息,见如下的截图信息:
如果参数没有-rs,就不会显示出详细的忽略执行的信息,见截图:
对测试用例进行分组执行,使用到的命令会有-m,也会有-k,见案例的源代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest @pytest.mark.login def test_login_001(): pass @pytest.mark.login def test_login_002(): pass @pytest.mark.user def test_user_001(): pass @pytest.mark.user def test_user_002(): pass
先使用-k测试搜索的方式来执行,执行的命令为:pytest -k "login or user",见执行结果输出信息:
这里我们使用-m的命令来执行,执行的命令为:pytest -m login
可以看到只会执行login分组的测试用例,而user分组的测试用例并不会被执行。当然有人可能会有疑问,想执行多个分组的怎么
办了?简单,实用-k测试搜索的方式进行。
下面来看测试用例的执行结果,测试子集的执行,先来看目前项目的结构目录:
这里执行tests包下所有的测试用例,执行的命令为:pytest tests/ --tb=no,见执行的结果截图:
当然-v 显示出详细的信息,--duration显示出测试用例执行的耗时时间从长到短的排序,见如下的结果截图信息:
在前面的案例代码中,都是关于函数式的编程方式,这里主要介绍面向对象的编程方式的应用,废话还是不多说,直接
上案例的代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest class TestXunit(object): def test_001(self): pass def test_002(self): pass
先单独执行该模块里面所有的测试用例,见执行的结果截图信息:
下来想执行一个测试类里面的具体测试用例,比如执行test_001的测试用例,执行的命令为:pytest -v 测试模块::测试类::测试用例,
见如下的结果截图信息:
在UI自动化测试中,selenium是一个主流的测试框架,在pytest也是支持对selenium的操作,需要安装第三方的库,安装
的命令为:
pip install pytest-selenium
在这里特别是强调,在一个测试函数或者是一个测试方法中,selenium是固定参数,指的是driver,对selenium框架熟悉的
同学知道,要操作浏览器,首先需要对webdriver进行实例化后,可以对浏览器进行操作。还是先来看简单的案例应用,打开
百度,断言百度的title,见案例的代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def test_baidu_title(selenium): selenium.get('http://www.baidu.com') assert selenium.title=='百度一下,你就知道'
在执行命令的时候,需要指定驱动driver以及要执行的浏览器,命令为:
pytest 测试模块 --driver Chrome(指定测试的浏览器),见执行结果的截图信息:
浏览器会自动打开,然后做业务操作,然后自动关闭,所以中间省去了打开浏览器和关闭浏览器的过程,编写测试类,完善下
这部分的测试场景,见案例的代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest class TestSelenium(object): def test_baidu_title(self,selenium): selenium.get('http://www.baidu.com') assert selenium.title == '百度一下,你就知道' def test_baidu_url(self,selenium): selenium.get('http://www.baidu.com') assert selenium.current_url=='https://www.baidu.com/' def test_baidu_so(self,selenium): '''获取搜索的关键字然后断言''' selenium.get('http://www.baidu.com') so=selenium.find_element_by_id('kw') so.send_keys('无涯课堂') assert so.get_attribute('value')=='无涯课堂'
执行的命令和前面的一样,其实使用pytest-selenium完全可以页面对象设计模式,把我很早期的代码
做一个简单的修改就可以了,这里解释了,后面写文章解释。见执行如上的代码后,输出的结果信息截图:
这里特别的强调,都多少个测试用例,浏览器打开关闭多少次。这个库很有意思的,后面我会结合框架写一套代码
让大家玩。
还有一种一种需求是按测试名称来执行的,也就是依据名称来指定测试集合,还是以具体的案例为实例来说明这
部分的应用,见案例源码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def test_api_001(): pass def test_api_002(): pass
这里使用到的命令是-k,它可以测试搜索到api的测试用例并且执行,见执行命令后输出的结果信息:
就会找到_api的测试用例并且会被执行。-k这个命令参数感觉特别的好使用。
下来来看参数化的部分,学习过ddt框架的同学可能知道,ddt它在相同的测试步骤中,可以实现一个测试用例的代码
依据请求参数的不同测试多个测试场景,关于这部分我在UI里面讲的也是比较多,在接口里面讲的基本很少,可以说是
没有。这里主要来看pytest中参数化的应用,比如有个函数,是两个数相加,需要测试的是两个数相加后的结果信息,还
是直接上代码,见案例源码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def add(a,b): return a+b @pytest.mark.parametrize('a,b,result',[ (1,1,2), (2,2,4), (3,3,6), (4,4,8), (5,5,10)]) def test_add(a,b,result): assert add(a,b)==result
首先我来解释下上面的代码,装饰器parameterize里面,第一个参数也就是测试函数的请求参数,需要一一对应,第二个请求参数是
是在里面里面的元组,也是需要与第一个请求参数,这样就是有几组请求参数,也就意味着有几个测试用例,在测试用例的函数中,也
是有参数的,也是与上面的需要一一的对应。在某些特殊的场景下,这个功能特别的厉害和强大,比如刚才写的函数来测试该函数的
功能,执行该测试代码,见执行后的结果信息:
更多推荐
所有评论(0)