zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    oracle查询第几行到第几行的数据
    php/js将 CST时间转成格式化时间
    js获取当前时间:yyyy-MM-dd HH:MM:SS
    mysql 查询时间戳格式化 和thinkphp查询时间戳转换
    Java语言基础:运算符
    APP的三种开发模式
    架构图-模型
    Java语言基础:常量和变量
    APP开发之Dcloud简介
    APP开发
  • 原文地址:https://www.cnblogs.com/fancyl/p/9141192.html
Copyright © 2011-2022 走看看