zoukankan      html  css  js  c++  java
  • python使用笔记28--unittest单元测试框架

    单元测试:开发程序的人自己测试自己的代码

    unittest自动化测试框架

    1、单元测试

    unittest框架,执行的顺序是按照方法名的字母来排序的

    setUpClass方法是最开始执行的

    tearDownClass是最后执行的

    setUp方法是在每个方法执行前执行的

    tearDown方法是在每个方法执行后执行的

     1 import unittest
     2 def add(a,b):
     3     return a+b
     4 
     5 #运行的顺序是按照方法名的字母排序的
     6 class AddTest(unittest.TestCase):#继承unittest
     7     def setUp(self):#在每个方法前执行
     8         print('我是set up方法')
     9 
    10     def tearDown(self):#在每个方法后执行
    11         print('我是tearDown方法')
    12 
    13     @classmethod
    14     def setUpClass(cls):#最先开始执行的
    15         print('我是setupclass方法')
    16 
    17     @classmethod
    18     def tearDownClass(cls):#最后执行的
    19         print('我是tearDownclass方法')
    20 
    21     def test_add_normal(self):
    22         print('add_normal')
    23         result = add(1,4)
    24         self.assertEqual(5,result)#预期结果,实际结果
    25 
    26     def test_add_error(self):
    27         print('add_error')
    28         result = add(1,1)
    29         yq=1
    30         self.assertEqual(yq,result,'add测试结果不通过,预计结果为%s,实际结果为%s'%(yq,result))
    31 
    32     def test_a(self):
    33         print('a')
    34 
    35     def test_b(self):
    36         print('b')
    37 
    38 unittest.main()#运行当前python文件中的所用用例

    2、产生测试报告

    2.1 HTMLTestRunner

    下载HTMLTestRunner.py放到python的环境变量里

     1 import unittest
     2 import HTMLTestRunner
     3 import nnreport
     4 
     5 class TestLogin(unittest.TestCase):
     6     def test_login_normal(self):
     7         '''正常登录'''
     8         self.assertEqual(1,1)
     9     def test_login_black_list(self):
    10         '''黑名单用户登录'''
    11         self.assertTrue(False,'黑名单登录运行失败')
    12     def test_login_exit(self):
    13         '''注销用户登录'''
    14         self.assertNotIn(1,[1,2,3],'这是not in 的')
    15 
    16     def test_login_max_count(self):
    17         '''超过最大错误次数登录'''
    18         self.assertNotEqual(1,2,'这是不相等的')
    19 
    20 
    21 # suite = unittest.TestSuite()#测试集合,手动一个个的把测试用例加入到测试集合中
    22 # suite.addTest(TestLogin('test_login_normal'))#加一个测试用例
    23 suite = unittest.makeSuite(TestLogin)#将整个测试用例都放进集合中
    24 
    25 #HTMLTestRunner
    26 f = open('测试报告.html','wb')
    27 runner = HTMLTestRunner.HTMLTestRunner(f,title='登录接口测试报告',description='这个是登录接口的测试报告')
    28 runner.run(suite)
    29 f.close()

    测试报告如何打开:

    1.选中文件--右键--Copy Path...--拷贝路径--放到浏览器中打开

    2.双击测试报告--在测试报告的html脚本中移动鼠标--会弹出浏览器的选项--选择对应的浏览器打开

    执行的测试报告如图所示:

    2.2 nnreport

    pip install nnreport

     1 import unittest
     2 import HTMLTestRunner
     3 import nnreport
     4 
     5 class TestLogin(unittest.TestCase):
     6     def test_login_normal(self):
     7         '''正常登录'''
     8         self.assertEqual(1,1)
     9     def test_login_black_list(self):
    10         '''黑名单用户登录'''
    11         self.assertTrue(False,'黑名单登录运行失败')
    12     def test_login_exit(self):
    13         '''注销用户登录'''
    14         self.assertNotIn(1,[1,2,3],'这是not in 的')
    15 
    16     def test_login_max_count(self):
    17         '''超过最大错误次数登录'''
    18         self.assertNotEqual(1,2,'这是不相等的')
    19 
    20 
    21 # suite = unittest.TestSuite()#测试集合,手动一个个的把测试用例加入到测试集合中
    22 # suite.addTest(TestLogin('test_login_normal'))#加一个测试用例
    23 suite = unittest.makeSuite(TestLogin)#将整个测试用例都放进集合中
    24 
    25 #BeautifulReport
    26 runner = nnreport.BeautifulReport(suite)
    27 runner.report(description='登录接口测试报告',filename='login_report.html',log_path='D:\')#描述,文件名,指定路径

    测试报告如图所示:

     

    2.3 查找测试报告

    一个文件夹下有多个测试的python文件

    1 import unittest
    2 import nnreport
    3 
    4 #在当前路径下,写名字
    5 #不在当前路径下,写绝对路径
    6 #test*.py制定一个查找规则,只找test开头的python文件,默认是test开头的python文件
    7 suite = unittest.defaultTestLoader.discover('cases','test*.py')
    8 report = nnreport.BeautifulReport(suite)
    9 report.report(description='查找测试用例的测试报告',filename='查找测试用例的测试报告.html')

    执行结果如图:

    3、参数化

    代码驱动:用例都是代码写的

    数据驱动:用例是根据数据来执行的

    关键字驱动:UI自动化的时候会用到

    pip install parameterized

    3.1 固定参数

     1 class stuInfoTest(unittest.TestCase):
     2     url = 'http://api.nnzhp.cn/api/user/stu_info'
     3 
     4     @parameterized.parameterized.expand([
     5         ['王月',18],
     6         ['小黑',11],
     7         ['小白',13],
     8         ['小慧',29],
     9         ['小兰',98]
    10     ])
    11     def test_single1(self,name,age):
    12         data = {'stu_name':name,'age':age}
    13         r = requests.get(self.url,data)
    14         print(r.json())

    3.2 文件参数

     1 import unittest
     2 import requests
     3 import parameterized
     4 import os
     5 
     6 class Get_Data:
     7     @staticmethod
     8     def read_data_to_file(file_name):
     9         datas = []
    10         if os.path.exists(file_name):
    11             with open(file_name,'r',encoding='utf-8') as fr:
    12                 for line in fr:
    13                     d1 = line.strip().split(',')
    14                     datas.append(d1)
    15         else:
    16             raise FileNotFoundError('参数化文件找不到')
    17 
    18         return datas
    19 
    20     @staticmethod
    21     def read_data_to_excel(file_name):
    22         pass
    23 
    24     @staticmethod
    25     def read_data_to_redis():
    26         pass
    27 
    28 # result = read_data('stu_info.txt')
    29 # print(result)
    30 # quit()
    31 
    32 
    33 class stuInfoTest(unittest.TestCase):
    34     url = 'http://api.nnzhp.cn/api/user/stu_info'
    37     #有多少条数据,就执行多少次
    38     @parameterized.parameterized.expand(Get_Data.read_data_to_file('stu_info.txt'))
    39     def test_single(self,name,age):
    40         print(name)
    41         data = {'stu_name':name,'age':age}
    42         r = requests.get(self.url,data)
    43         print(r.json())
  • 相关阅读:
    第8章 字符串
    第7章 方法
    第6章 类和对象
    第5章 数组
    第4章 循环结构、break与continue
    第3章 选择结构
    第2章 变量、数据类型和运算符
    Codeforces Round #426 (Div. 2)
    CCNA学前基础一
    Tinkoff Challenge
  • 原文地址:https://www.cnblogs.com/cjxxl1213/p/13205098.html
Copyright © 2011-2022 走看看