第二天 selenium基础,unittest框架,ddt
第三天 ddt实际应用,yaml文件,ecshop线性化脚本
第四天 封装相同步骤,测试数据与脚本分离,引入PO设计模式进行基础类与操作页面的封装
1.单元测试框架
#总结:
# 1. setup()、teardown(),每条用例执行前后都要运行一次,适用于一条用例,多条用例耗费时间
# 2. setUpClass()、tearDownClass(),所有用例执行前后总共运行一次,适用于批量执行用例
# 3. 测试用例的执行顺序依据用例名称顺序执行
# 4. 自动化测试脚本必须要有环境恢复(删除存入数据库的内容等)
# 5. 环境恢复是在用例执行结束后,但自动化脚本的环境恢复代码可以紧跟在环境预置之后,不影响执行顺序
'''
# unittest框架的全局变量:
# 1.使用 类名.变量名,如 MyTest.name = "全局变量1"
# 2.使用 globals()["变量名"],如 globals()["name"] = "全局变量2"
# 3.使用 self.变量名,如 self.name = "全局变量3"
# 全局变量1、2,在不同方法之间可以实时使用、修改变量值,
# 全局变量3,在unittest框架,无法在不同方法间共享参数变动
import unittest
class MyTest(unittest.TestCase):
# pass
# 环境预置
# def setUp(self):
# print('环境预置')
@classmethod #使用setUpClass必须声明装饰器
def setUpClass(self):
###批量执行用例时使用
print('环境预置')
#测试用例
#测试用例必须是test开头
def testCase_1(self):
#期望结果
expectResult = 'hello'
actualResult = 'hello world'
print('测试用例的操作步骤1')
#断言
self.assertIn(expectResult,actualResult)
def testCase_2(self):
#期望结果
expectResult = 123
print('测试用例的操作步骤2')
#断言
self.assertEqual(expectResult,123,msg = "不相等")
# 恢复环境
# def tearDown(self):
# print('恢复环境')
@classmethod #使用tearDownClass必须声明装饰器
def tearDownClass(self):
print('恢复环境')
if __name__ == '__main__':
unittest.main()
2. ddt数据驱动
在线安装:pip install ddt
若在线安装失败,则使用以下镜像安装:
pip install ddt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
ddt使用方式:方法前面加@
ddt常用方法:
ddt.ddt 在类前面进行声明ddt
ddt.data() 引入测试数据ddt.data(),括号里面的数据可以封装成字典格式,不加引号,
单条数据如@ddt.data({"name":"juzi","resultCode":"0"})
多条数据如@ddt.data({"name":"juzi","resultCode":"0"},
{"name":"juzi2","resultCode":"22"})
ddt.unpack 将测试数据分解。如果引入的是参数文件 ddt.file_data(),则分解可以省略
ddt.file_data() 引入外部参数(测试数据文件),括号里面是引号,引号里面是.json文件
注意:ddt引入数据、分解数据,都在测试用例上面,即def testCase()上面,
引入数据(如{"name":"tom","expectCode":"0"})的所有变量名name、expectCode都要放在testCase()里面,
即testCase(self,name,expectCode)
注:json文件格式,需要用双引号:
{
"testCase01":{"username":"juzi8","expectResult":"msg\":\"invalid username/password combination\""},
"testCase02":{"username":"juzi9","expectResult":"msg\":\"invalid username/password combination9\""}
}
3.补充yaml:
yaml特点:
1.大小写敏感
2.使用缩进表示层级关系,缩进不允许使用Tab键,只能空格
3.缩进的空格数量不限制,只要相同层级的元素左对齐即可
4.使用 # 表示注释,代表注释一行,跟python类似
使用ddt.file_data("data.yaml"),需要先安装:pip install pyyaml
data.yaml里面内容有如下两种写法(注意参数后面有一个空格):
test01:
username: 'juzi01'
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi01"'
test02:
username: 'juzi02'
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi02"'
对应脚本写法:
@ddt.file_data('data.yaml')
@ddt.unpack
def testCase(self,username,password,password_confirmation,expectResult):
parms = {"username":username,"password":password,"password_confirmation":password_confirmation}
res = requests.post(self.url,parms)
#print(res.text)
#print(expectResult)
self.assertIn(expectResult,res.text)
或:
test01:
parms:
username: juzi03
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi03"'
test02:
parms:
username: juzi04
password: 123456
password_confirmation: 123456
expectResult: "\"username\":\"juzi04\""
对应脚本写法:
@ddt.file_data('data.yaml')
@ddt.unpack
def testCase(self,parms,expectResult):
res = requests.post(self.url,parms)
#print(res.text)
#print(expectResult)
self.assertIn(expectResult,res.text)