本文目录一览:
- 1、自动化测试-unittest框架,理论和实操双管齐下
- 2、请教:python装饰器如何不改变原函数名
- 3、python ddt 支持读取json格式数据么
- 4、为什么python 自动化测试 使用@ddt、@unpack后会都执行一次setUp函数?
- 5、xlrd实现从excel文件读取数据
- 6、DDT与pytest.mark.parametrize参数化区别
自动化测试-unittest框架,理论和实操双管齐下
unittest
1、什么是Unittest框架?
python自带一种单元测试框架
2、为什么使用UnitTest框架?
批量执行用例
提供丰富的断言知识
可以生成报告
3、核心要素:
1). TestCase(测试用例)
2). TestSuite(测试套件)
3). TestRunner(测试执行,执行TestUite测试套件的)
4). TestLoader(批量执行测试用例-搜索指定文件夹内指定字母开头的模块) 【推荐】
5). Fixture(固定装置(两个固定的函数,一个初始化时使用,一个结束时使用))
接下来会展开 核心要素来认识unittest框架:
首先介绍下unittest的用例规则:
1、测试文件必须导包:import unittest
2、测试类必须继承 unittest.TestCase
3、测试方法必须以 test_开头
一、TestCase(测试用例)
1、是一个代码文件,在代码文件中来书写真正的用例代码 (里面的print均是模拟测试用例)
说明:def 定义的test_ 是测试用例,只有执行 if __name__ == '___mian___' 的时候会执行测试用例,其他普通函数则不执行,通过 self 来调用执行。
二、TestSuite(测试套件)和TestRunner(测试执行)
1、TestSuite(测试套件):用来组装,打包 ,管理多个TestCase(测试用例)文件的
2、TestRunner(测试执行):用来执行 TestSuite(测试套件的)
代码:首先要准备多个测试用例的文件才可以实现TestSuite和TestRunner,以下代码是已经准备了unittest_Demo2和unittest_Demo1两个测试用例文件
三、TestLoader(测试加载)
说明:
2. 搜索指定目录文件下指定字母开头的模块文件下test开始的方法,并将这些方法添加到测试套件中,最后返回测试套件
3. 与Testsuite功能一样,对他功能的补充,用来组装测试用例
一般测试用例是写在Case这个文件夹里面,当测试用例超多的时候就可以考虑 TestLoader
四、Fixture(测试夹具)
是一种代码结构,在某些特定情况下,会自动执行。
4.1 方法级别
在每个测试方法(用例代码)执行前后都会自动调用的结构
def setUp(),每个测试方法执行之前都会执行 (初始化)
def tearDown(),每个测试方法执行之后都会执行 (释放)
特性:几个测试函数,执行几次。每个测试函数执行之前都会执行 setUp,执行之后都会执行tearDwon
4.2 类级别
在每个测试类中所有方法执行前后 都会自动调用的结构(在整个类中 执行之前执行之后各一次)
def setUpClass() ,类中所有方法之前
def tearDownClass(),类中所有方法之后
特性:测试类运行之前运行一次setUpClass ,类运行之后运行一次tearDownClass
注意:类方法必须使用 @classmethod修饰
案列模板:结合了类级别和方法级别实现的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBxQV2uP-1647245316010)(C:/Users/15277/AppData/Roaming/Typora/typora-user-images/image-20220303153824329.png)]
五、断言
1、什么是断言:
让程序代替人工自动的判断预期结果和实际结果是否相符
断言的结果:
1)、True,用例通过
2)、False,代码抛出异常,用例不通过
3)、在unittest中使用断言,需要通过 self.断言方法
2、为什么要断言:
自动化脚本执行时都是无人值守,需要通过断言来判断自动化脚本的执行是否通过
注:自动化脚本不写断言,相当于没有执行测试一个效果。
3、常用的断言:
对于一些未完成的或者不满足测试条件的测试函数和测试类, 不想执行,可以使用跳过
结果
七、数据驱动(unittest ddt)
ddt:data-driver tests
数据驱动:是以数据来驱动整个测试用例的执行, 也就是测试数据决定测试结果
数据驱动解决的问题是:
1)、代码和数据分离,避免代码冗余
2)、不写重复的代码逻辑;
在python解释器中需要安装 ddt 这个包才能用:
要检查是否安装上,在cmd当中 输入 pip list命名,有ddt说明安装成功
语法:
1、使用数据驱动,要在class前加上修饰器 @ddt
说明:方法里面使用 print ,为了方便,模拟测试用例,主要是为了学习数据驱动,实际中方法里面写的是测试用例的代码
1)、结合 selenium 使用 ddt
self:相当于java中的this,当前对象的引用,self.driver定义了driver这个变量。
2、在实际中不可能是单一参数进行传参,将会使用多个参数进行传参:
但是以上步骤都是数据在代码当中的,假如要测试n个手机号这样的数据,全部写在 @data 装饰器里面就很麻烦,这就引出了数据驱动里面的代码和数据的分离。
3、将数据放入一个文本文件中,从文件读取数据, 如JSON、 excel、 xml、 txt等格式文件 ,这里演示的是json文件类型.
json文件处理, 这个链接介绍了json文件和Python文件基本操作
(1)、在json文件驱动
(2)、在测试代码中读取json文件
执行结果:
一行表示一组:
写法一:
写法二:推荐
对应的json文件
写法:
注意:file_date 装饰器,可以直接读取yaml和json文件
建立excel表的时候需要退出pychram在根目录下创建excel表保存,否则会报错
用excel登录csdn操作
用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将
是一个非常棒的功能,也会给我们错误定位带来方便
截图方法: driver.get_screenshot_as_file
有两种测试报告:
只有单独运行 TestCase 的代码,才会生成测试报告
这里需要第三方的测试运行类模块,然后放在代码的目录中
就像这两个模块一样放进代码目录中
写法一:
写法二:
这里面的当前路径也可以用 ./ 来表示!!!
注意:
实例化 第三方的运行对象,HTMLTestRunner()的初始化有多种可以自定义设置
最后生成结果
unittest框架就本上就是这些知识了,里面记得东西很多,多敲代码,形成记忆...
请教:python装饰器如何不改变原函数名
装饰器是用在函数不修改添加新功能的情况下诞生的,一般在需要装饰的函数上写
@funcname
def funb(){
.....
}
然后再装饰的函数里面去调用原函数,以达到不修改添加功能的作用
python ddt 支持读取json格式数据么
#读file = 'test.json'fp = open(file, 'r')dict = json.dump(fp.read())fp.close()#写testDict = {'a':1,'b':2}file = 'my.json'fp = open(file,'w+')fp.write(json.loads(testDict))fp.close()
为什么python 自动化测试 使用@ddt、@unpack后会都执行一次setUp函数?
setUp和tearDown的执行跟ddt没有关系,是测试框架如unittest里边的内容。
如果只想执行一次,可以改为:
@classmethod
def setUpClass(cls):
pass
xlrd实现从excel文件读取数据
自动化测试时,经常会提到数据驱动的概念。数据驱动是以数据来驱动整个测试用例的执行,即测试数据决定测试结果。Python中ddt模块可以实现。 python 操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
如果测试数据写入到excel文件中,该如何从中获取数据呢?
● 假设测试登录功能的用例:
● 正常账号密码登录成功;
● 错误账号登录失败;
● 错误密码登录失败;
● ......
根据当前系统数据,准备好三组测试用例的数据,写入到excel表格中:
读取数据使用xlrd(支持xls格式)示例:
附Xlrd常用操作如下:
打开excel:
那么这样就可以读取到数据了。
DDT与pytest.mark.parametrize参数化区别
一、DDT解析参数
ddt 是第三方模块,需安装, pip install ddt
DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据)
通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。
@data(a,b)
那么a和b各运行一次用例
@data([a,d],[c,d])
如果没有@unpack,那么[a,b]当成一个参数传入用例运行
如果有 @unpack ,那么[a,b]被分解开,按照用例中的两个参数传递
1、测试参数如下:
login_data=[{"para":{"mobilephone":"18777770000","pwd":"123456"},"method":"get","msg":"登录成功"},
{"para": {"mobilephone":"18777770000","pwd":"000000"},"method":"get","msg":"用户名或密码错误"},
{"para": {"mobilephone":" ","pwd":"123456"},"method":"get","msg":"手机号不能为空"}]
2、测试用例使用DDT解析参数:
from ddt import ddt,data
#装饰测试类
@ddt
class TestHttpRequest(unittest.TestCase):
#装饰测试用例
@data(*login_data)
def test_login_1(self,data):
res=HttpRequest(data['url'],data['param']).http_request(data['method'])
print("测试结果:{0}".format(res.json()))
执行3条用例
标记函数参数化(测试用例方法前加测试数据):@pytest.mark.parametrize("a,b,expected", testdata)
语法:
ep1 传入单个参数
@pytest.mark.parametrize('参数名',lists)
ep2 传入两个参数
('参数1','参数2',[(参数1_data[0],参数2_data[0]),(参数1_data[1],参数2_data[1])]
传三个或者更多也是这样传。list的每个元素都是一个元祖,元祖里的每个元素和按参数顺序一一对应。