1.yaml 可以用来做数据驱动,比较灵活
import yaml #用来读配置文件的比如file文件 文件以yaml和yml结尾 这种格式写用例比较容易处理,字典方便取值 取不到就没有不报错,主要是灵活。
f = open('login.yaml',encoding='utf-8')
res = yaml.load(f) #加载读出文件 将键值对转化为字典
print(res)
比如:login.yml
- #是list的写法 可以防止字典相同的key覆盖
url : /api/user/login
method : post
detail : 正常登录
data :
username : niuhanyang
passwd : aA123456
check :
- userId
- sign
-
url : /api/user/login
method : post
detail : 密码错误
data :
username : niuhanyang
passwd : aA12333
check :
- 密码错误
-
url : /api/user/login
method : post
detail : 不传密码
data :
username : niuhanyang
check :
- 必填参数未填
2.单元测试
import unittest #单元测试模块
import HTMLTestRunner #用来生成报告用
from BeautifulReport import BeautifulReport as bf #好看的测试报告 bf是别名方便使用
class TestCalc(unittest.TestCase): #继承 变为测试用例
def setUp(self):
print('setup是啥时候运行的')
#每个用例运行之前运行的 可以作为后续的前提条件
def tearDown(self):
print('teardown是啥时候运行')
#每个用例运行之后运行的 可以在收尾做比如删除数据的操作。
@classmethod #定义类方法
def setUpClass(cls): #直接继承父类方法
#在所有用例执行之前运行的
print('什么时候运行的setupclss')
@classmethod
def tearDownClass(cls):
#在所有用例都执行完之后运行的
print('什么时候运行的teardownclass')
def testliuwei(self): #用例执行顺序是按照首字母的顺序(在报告中可看出)
'''刘伟测试''' #通过‘’‘来加入用例描述 报告中就会加入用例描述
print('刘伟')
self.assertEqual(1,1) #该子类没有 继承父类比较两个值 后面也可以再加参数作为提示信息。
def testzch(self): #以test开头就可以运行用例 否则不会自动运行
'''赵传慧测试'''
print('赵传慧')
self.assertEqual(1,2)
def testa(self):
print('testa')
self.assertEqual(1,1)
def testc(self):
print('testc')
self.assertEqual(1,2)
# unittest.main() #会运行当前python文件里面的所有测试用例 **运行时注意run 产生报告时不用该模式
将用例产生报告主要有以下几个步骤
# 1、先把所有的测试用例都放到用例集。用例集也做测试套件是用来存放测试用例的
#2、运行这些测试用例
#3、产生报告
suite = unittest.TestSuite() #测试集合 存放用例 其实是一个list
suite.addTest( unittest.makeSuite(TestCalc) ) #把刚才写的用例加进来 **写入类名
bf报告生成
run = bf(suite) #实例化一下,他是一个类必须实例化使用
run.report(description='描述必须写',filename='test') #还可指定log位置等
HtmlTESTRunner如何产生报告
# f = open('test.html','wb') #以2进制模式 不考虑编码集的问题
# runner = HTMLTestRunner.HTMLTestRunner(f,title='双鱼座用例标题',description='这是用例描述') #后面两个参数是非必须的
# runner.run(suite) #运行用例
3.利用yaml做数据驱动来做测试接口
import unittest,requests
import ddt # #可做参数化 自动读文件中数据
from BeautifulReport import BeautifulReport as bf
from urllib import parse
@ddt.ddt #申明这个类要别ddt使用啦
class Login(unittest.TestCase):
base_url = 'http://118.24.3.40/' #为给url统一加前缀 可写入配置文件比较好
@ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,并且传给下面函数的如kwargs中,有多少条数据循环调用多少次下面的函数 注意修改文件open源码加入utf8编码打开不报错
def test_request(self,**kwargs):
detail = kwargs.get('detail','没写用例描述') # '''和%s组合来描述用例在这里无效。
self._testMethodDoc = detail #动态的用例描述
url = kwargs.get('url')#url
url = parse.urljoin(self.base_url,url)#拼接好url 只能拼接 比如关于/的问题处理
method = kwargs.get('method','get')#请求方式给他一个默认值get 防止没有传请求方式
data = kwargs.get('data',{}) #请求参数
header = kwargs.get('header',{})#请求头
cookie = kwargs.get('cookie',{})#cookie
check = kwargs.get('check')
method = method.lower() #便于处理
try:
if method=='get':
res = requests.get(url,params=data,cookies=cookie,headers=header).text
#因为接口有异常的情况下, 可能返回的不是json串,会报错
else:
res = requests.post(url,data=data,cookies=cookie,headers=header).text
except Exception as e:
print('接口请求出错')
res = e
for c in check:
self.assertIn(c,res,msg='预计结果不符,预期结果【%s】,实际结果【%s】'%(c,res)) #查看是否包含 断言查看一次错误就停止,后面加如错误提示 但check在yml中得是list方便查看是否包含。
sutie = unittest.TestSuite()
sutie.addTest(unittest.makeSuite(Login))#添加用例
run = bf(sutie) #实例化
run.report('login_test','登录测试用例')
print(run.success_count) #通过的次数
print(run.failure_count) #失败的次数
思考?
# 1、运行的用例条数是不是和你的用例数一样
# 2、看看有没有其他不对的地方