• 自动化测试第十一节---unittest


    1、框架的定义:框架就是别人已经封装好的一些代码,它已经有了一些功能,咱们直接用就行了。

    2、pycharm自带的测试框架:unittest

    3、自动化测试的过程:执行用例、校验结果、产生测试报告

    4、测试报告的产生:HTMLTESTrunner这个模块产生的报告,是给咱们自己看的可视化报告,xmlrunner这个模块,产生的报告是给Jenkins的

    一、unittest单元测试

    测试用例封装在类中,类里的每个函数是一个测试用例,类是一个测试组,执行测试用例的顺序是按照测试用例的名称首字母排序的,非从上到下执行

    先安装模块:
    pip install nose-parameterized#unittest参数化
    pip install xmlrunner#产生xml格式测试报告
    再将HTMLTestRunner.py文件加入python的环境变量中:产生html格式的可视化测试报告

    1、编写测试用例
    import unittest
    import HTMLTestRunner,xmlrunner
    class My(unittest.TestCase):#定义类,object为unittest.TestCase
    def test1(self):#写用例1,用例的名字必须以test开头,如果用例不是以test开头,那么不会运行它
    '''用例描述'''#描述的内容会展示在测试报告中,描述测试用例的内容
    self.assertEqual(1,2)#校验结果,这个方法是校验左右两个传参是否一致
    def test2(self):#写用例2
    ... ...
    2、运行所有的测试用例:
    unittest.main()#
    3、将指定用例添加到集合,一起运行:
    首先定义一个空的测试集合:
    suite = unittest.TestSuite()
    其次添加用例:
    1)添加My中的某个测试用例:suite.addTest(My('test1'))
    2)将My中的所有测试用例都添加进来:suite.addTest(unittest.makeSuite(My))用例放在多个文件中时:

    3) 找到case目录下所有的test_*.py文件,循环添加case到测试集合里面
    all_case = unittest.defaultTestLoader.discover(r'E:day11AUTOcase','test_*.py')
    for case in all_case:
    suite.addTests(case)

    4、生成一个html文件的测试报告:
    with open('test_new.html','wb') as fw:#新建一个测试报告的文件
    runner = HTMLTestRunner.HTMLTestRunner(stream=fw,title='这是测试报告的标题',description='这是测试报告的描述')#新建一个测试报告的模板
    runner.run(suite)#执行测试集合并保存到测试报告中

    5、生成一个xml格式的测试报告:
    runner = xmlrunner.XMLTestRunner(output='report')#输入到report文件夹中
    runner.run(suite)#执行成功后,生成格式如TEST-My-20171230132616.xml的xml文件(My为测试组的类名,suite中有多个类时会生成多个xml文件,后缀产生报告的时间)
    生成的html测试报告如下:

     

    二、unittest参数化
    1、用户定义变量参数化
    import unittest,HTMLTestRunner
    from nose_parameterized import parameterized#导入参数化的模块
    def login(username,passwd):#定义一个待测试的模块,如登录
    if username=='niuhanyang' and passwd=='123456':
    return '138'
    return False
    class Login(unittest.TestCase):#定义一个测试登录的用例组
    @parameterized.expand(#设置n个参数组,每一个列表是一个参数组,代表用例中的传参,执行用例时循环所有参数组,即用例执行n次
    [
    ['niuhanyang','123456','138'],
    ['niuhanyang','',False],
    ['','',False],
    ['ssj','12345',False]
    ]
    )
    def test_login(self,username,passwd,hope):#定义一个测试用例,测试登录
    '''测试登录模块'''
    res = login(username,passwd)#调用登录模块
    self.assertEqual(res,hope)#比对测试结果
    if __name__ == '__main__':#执行测试
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Login))
    fw = open('login.html','wb')
    runner = HTMLTestRunner.HTMLTestRunner(stream=fw,title='登录测试结果')
    runner.run(suite)

    2、文件参数化
    1)定义一个user.txt文件存放要参数化的内容,如:
    nyy,123456,True
    wxc,123456,True
    2)定义一个函数,将txt中的内容处理为parameterized可处理的列表格式
    def readCvs(file, sep=','):
    lis = []
    with open(file, 'rb') as f:
    for line in f:
    sub_list = line.decode().strip().split(sep)
    lis.append(sub_list)
    return lis
    3)定义用例时使用参数化的方式,@parameterized.expand中的传参其实还是二维列表,只是之前多了一道从文件读取的结果
    class My(unittest.TestCase):
    @parameterized.expand(readCvs('users.txt'))
    def testa(self,a,b,hope):
     
    三、接口测试
    import unittest
    class MyTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
    print('什么时候运行我呢,我是setUpClass')
    #这个类下面所有用例运行之前先运行setUpClass

    @classmethod
    def tearDownClass(cls):
    print('什么时候运行我呢,我是tearDownClass')
    #这个类下面所有用例运行完之后运行tearDownClass

    def setUp(self):
    print('每个用例运行之前都会先运行我,不管用例运行成功或者失败')
    def tearDown(self):
    print('每个用例运行之后都会再运行我,不管用例运行成功或者失败')
    def test_nyy1(self):
    self.assertEqual(1,1)
    print('第一条用例')
    def test_nyy2(self):
    print('第二条用例')
    self.assertEqual(1,2)
    if __name__=='__main__':
    unittest.main()
    四、获取前一条用例的结果

    直接在类中定义一个函数,返回前一条用例的结果,再在用例中内部调用这个函数取得结果即可
     
     
     

     

  • 相关阅读:
    VSCode搭建golang环境
    Jmeter之连接数据库
    Jmeter之『如果(If)控制器』
    mysql时间SQL
    正则表达式查找“不包含XXX字符串”
    Jmeter5.3源码编译
    Log4j源码分析
    12 个 JS 技巧
    高效学习很重要
    IntelliJ IDEA自动导入包去除星号(import xxx.*)
  • 原文地址:https://www.cnblogs.com/ninanie/p/8149916.html
Copyright © 2020-2023  润新知