用unittest框架写的接口自动化实现过程:
1.编写ymal格式用例:
2.导入ddt模块,该模块的主要功能是帮你读取ymal用例文件,自动获取内容并循环调用函数,具体见代码。
3.导入BeautifulReport模块,生成报告的模块。
4.导入unittest模块,使用unittest模块框架,编写自动化调用接口测试。
代码:
import unittest,requests import ddt from BeautifulReport import BeautifulReport as bf from urllib import parse #为了用parse.urljoin()方法,智能拼接url @ddt.ddt #自动的把ymal文件中的用例读出来 class Login(unittest.TestCase): #打开用例文件,调用接口 base_url = 'http://118.xx.xx.xx/' @ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,将yaml文件的字典自动传给**kwargs def test_request(self,**kwargs): #多个参数时用**kwargs,它接收字典里所有的k,v,即用例里的k,v detail = kwargs.get('detail','没写用例描述') self._testMethodDoc = detail #动态的用例描述,即用例里的描述。不加的话,用例描述会为null url = kwargs.get('url')#url url = parse.urljoin(self.base_url,url)#parse.urljoin()自动拼接好url method = kwargs.get('method','get')#请求方式,如果没有传参,默认是get请求 data = kwargs.get('data',{}) #请求参数,如果get不到的话,默认给一个空字典 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 #e接口返回的错误信息 #用用例里的成功返回字段作为校验标示,这样写使这个校验可以通用所有的测试用例 for c in check: #实际结果(用例里check写成了一个list) self.assertIn(c,res,msg='预计结果不符,预期结果【%s】,实际结果【%s】'%(c,res)) #assertIn()断言,如果c不在check里,不会进行第二次循环校验 sutie = unittest.TestSuite() #实例化用例集合 sutie.addTest(unittest.makeSuite(Login)) #将Login函数添加进来 run = bf(sutie) #实例化报告 run.report('login_test','登录测试用例') #运行并生成报告文件 print(run.success_count) #通过的次数 print(run.failure_count) #失败的次数
注意事项/知识点:
1.from urllib import parse ,为了用parse.urljoin()方法,智能拼接url
2.ddt模块
3.断言:.assertIn(a,b,msg),判断a是否在b里,不是的话给出报错信息:msg
4.将结果通过for c in check的方式判断,可以作为通用方式来判断所有测试用例,较简单,通用。
5.在首次运行时,@ddt.file_data()函数会报错,如下图:
修正方法:鼠标移动至@ddt.file_data,按住Ctrl并用鼠标点击file_data函数,进入其源码,进入open()方法,加入encoding='utf-8'即可。
另外,也有一种比较繁琐的校验方法,如下:
import unittest,requests import ddt from BeautifulReport import BeautifulReport as bf from urllib import parse #为了用parse.urljoin()方法,智能拼接url @ddt.ddt #自动的把ymal文件中的用例读出来 class Login(unittest.TestCase): #打开用例文件,调用接口 base_url = 'http://118.xx.xx.xx/' @ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,将yaml文件的字典自动传给**kwargs def test_request(self,**kwargs): #多个参数时用**kwargs,它接收字典里所有的k,v,即用例里的k,v detail = kwargs.get('detail','没写用例描述') self._testMethodDoc = detail #动态的用例描述,即用例里的描述。不加的话,用例描述会为null url = kwargs.get('url')#url url = parse.urljoin(self.base_url,url)#parse.urljoin()自动拼接好url method = kwargs.get('method','get')#请求方式,如果没有传参,默认是get请求 data = kwargs.get('data',{}) #请求参数,如果get不到的话,默认给一个空字典 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 #e接口返回的错误信息 #这种方式就是校验每个结果与预期结果比较,比较繁琐,必须校验返回值的时候可用 userid = check.get('userId') #返回的预期结果 error_code = check.get('error_code') #返回的预期结果code if userid: real_userid = res.get('login_info').get('userid') self.assertEqual(userid,real_userid,'校验userid是否一致') #判断userid,real_userid是否一致,不一致返回错误信息 real_code = res.get('error_code') self.assertEqual(error_code,real_code,'校验接口返回码是否一致') sutie = unittest.TestSuite() #实例化用例集合 sutie.addTest(unittest.makeSuite(Login)) #将Login函数添加进来 run = bf(sutie) #实例化报告 run.report('login_test','登录测试用例') #运行并生成报告文件 print(run.success_count) #通过的次数 print(run.failure_count) #失败的次数
over!