zoukankan      html  css  js  c++  java
  • unittest的参数化与查找测试用例(parameterized模块)

    知识背景:

      在实际工作中,会经常遇到一些场景,比如要测试一个接口,测试多组不同的账户密码数据时,需要写多个case来实现,这种情况只是参数不同,实际都是登录的操作,对于参数情况比较多时,写case非常的不方便。那怎么处理呢?就得把这些参数都写到一个list里面, 然后循环去执行这个case。这样就可以省去写多个case了

      在unittest中有一个模块能实现这种功能,parameterized模块

      了解一下用例设计的三种模式:

        数据驱动:通过将参数存入一个文件,执行代码存入一个文件,实现代码与参数分离,parameterized即可实现简单的数据驱动

        代码驱动:通过编写代码来实现

        关键字驱动:将测试用例的执行步骤存放在文件中,每个步骤单独封闭成一个函数,以这个函数名作为关键字,将函数名及传参写入文件中,每个步骤对应一行文件,一般在ui自动化时用的比较多,一个动作对应一个函数,如 {‘点击’:click,'双击':dbclick,'退出':exit}

        下面对登录接口参数的一个例子

    import unittest,parameterized
    
    import BeautifulReport
    
    data = [
        ['admin','123456',True,'正常登录'],#True为程序的预期结果,‘正常登录’表示预期结果描述用来填充报告中“用例描述”字段
        ['admin','1122',False,'冻结用户登录'],
        ['ssfss','2222',False,'黑名单用户登录']
    ]
    #扩展:可通过excel、txt等文件来存储参数,再读入到一个二维list进行操作
    
    def login(user,password):
        if user =='admin' and password =='123456':
            return True
        return False
    
    if __name__ == '__main__':
        class LoginTest(unittest.TestCase):
    
            @parameterized.parameterized.expand(data)
            def test_login(self,username,password,expect,desc):
                self._testMethodDoc = desc #用例描述指定内容
                #登录用例                     #使用默认内容“登录用例+系统自带描述”
                result = login(username,password)
                self.assertEqual(expect,result)
        # unittest.TestSuite
        suite_case = unittest.makeSuite(LoginTest)#创建一个测试集合
        bf = BeautifulReport.BeautifulReport(suite_case)#实例化一个beatifulreport对象
        bf.report(filename='login接口测试',description='接口测试报告')#可使用log_path参数将报告存放到对应路径
    

      

    查看BeatifulReport的报告,已经自动运行3组用例,并按指定内容填加了用例描述

    参数化可演化为从txt 文件、excel、redis、数据库中来获取数据,如下将数据来源封装为一个类,返回二维list

    import unittest
    import requests
    import parameterized
    import os
    
    class GetData:
    
        @staticmethod     #由于各个方法没有关联性,可使用静态方法修饰
        def read_data_to_file(filename):
            data = []
            if os.path.exists(filename):
                with open(filename,'r',encoding='utf-8') as fr:
                    for line in fr:
                        d1 = line.strip().split(',')  #每行分隔完之后变成一个数组
                        data.append(d1)
            else:
                raise FileNotFoundError('参数化文件找不到')
            return data
    
        @staticmethod
        def read_data_to_excel(file_name):
            pass
    
        @staticmethod
        def read_data_to_redis(key):
            pass
    
        @staticmethod
        def read_data_to_mysql(sql):
            pass
    
    
    
    class StuInfoTest(unittest.TestCase):
        url = 'http://****/api/user/stu_info'
    
        @parameterized.parameterized.expand(GetData.read_data_to_file('stu_info.txt'))
        def test_single(self,name,age):
            print(name,age)
            data = {'stu_name':name,'age':age}
            r = requests.get(self.url,data)
            print(r.json())
    
        @parameterized.parameterized.expand([
            ['xiaohei',2],
            ['xiaobai',2],
        ])
        def test_more(self,name,age):
            data = {'stu_name':name,'age':age}
            r = requests.get(self.url,data)
            print(r.json())
    
    
    unittest.main()
    

      

    二、查找测试用例

      在实际的测试工作中,我们不可能将所有的测试用例写在一个py文件中,而是在一个目录下编写多个py文件来存储不同的测试用例 ,那么我们就需要找到所有的测试用例

      如下的例子中,如何查找cases目录下的testa b c三个用例,使用工作中大多使用utp这样的文件目录

      

      

    import unittest
    import BeautifulReport as bfr
    '''查找某个目录下的以test开头文件名的测试用例'''
    suite = unittest.defaultTestLoader.discover('cases','test*.py')
    '''discover第一个参数为目标用例集合的地址,如果是跨目录的,可使用绝对路径,第二个参数为以test开头的文件名'''
    
    '''产生报告'''
    report = bfr.BeautifulReport(suite)
    report.report(description='测试案例集合',filename='report.html')
    

      

      

  • 相关阅读:
    jsp九大内置对象和4个域对象
    小甜点
    response编码
    request请求编码处理
    防盗链模拟
    request浏览器判断
    request获取ip
    ServletConfig
    HttpServlet原理
    Servlet,GenericServlet,httpServlet区别
  • 原文地址:https://www.cnblogs.com/bugoobird/p/13111602.html
Copyright © 2011-2022 走看看