unittest自动化测试举例:自动读取ymal用例&调用接口并生成报告

用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!

猜你喜欢

转载自www.cnblogs.com/fancyl/p/9141192.html