• 024python-unittest测试框架


     单元测试的本质 测试函数 代码级别的

    单元测试的框架 unittest+接口学习 pytest+web学习,学习后可以运用到接口

            unittest 是python 的单元测试框架,unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。

            作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,必须需要知道所使用语言的单元测试框架。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元, 由测试容器组织起来,到时候直接执行,同时引入测试报告。

    测试步骤 :

    1.写用例 TestCase

    2.执行用例

    2-1.TestSuite 存储用例

    2-2.TestLoader 找用例,加载用例,存储到2-1的TestSuite

    3.对比实际结果 预期结果 判定用例是否通过 (断言 Assert)

    4.出具测试报告 TextTestRunner

    注意:TestSuite和TestLoader 是类

     

    1.写用例 TestCase

    1.先创建一个MathMethod.py的文件,写一个MathMethod的类,如下:

    1. class MathMethod:
    2. def __init__(self,a,b):
    3. self.a=a
    4. self.b=b
    5. def add(self): # 加法函数
    6. return self.a+self.b
    7. def multi(self): # 乘法函数
    8. return self.a*self.b

    2.创建一个class_01.py的文件,编写并执行测试用例

    首先引用unittest,然后引用之前准备的MathMethod类,然后编写用例并执行。

     编写测试用例

    1.一个用例就是一个函数 不能传参 只能有self关键字

    2.所有的用例(所有的函数 都是test开头,一般是test_)*****

    1. # 引入unittest,unittest里面有专门写测试用例的TestCase
    2. import unittest
    3. # 导入自己写的方法,from...import,import后面至少具体到模块名,且一层层进入
    4. from Unittest_006.math_method import MathMethod #测试的目标
    5. # 继承unittest里面的TestCase ,专门写用例,编写一个加法测试用例
    6. class TestMathMethod(unittest.TestCase):
    7. # 编写测试用例
    8. # 1.一个用例就是一个函数 不能传参 只能有self关键字
    9. # 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
    10. # 两个正数相加
    11. def test_add_tow_positive(self):
    12. # 实例调用函数,使用res存储返回值
    13. # 实际发起请求的结果值
    14. res=MathMethod(1,1).add()
    15. print('1+1的结果是:',res)
    16. # 两个负数相加
    17. def test_add_tow_negative(self):
    18. # 实例调用函数,使用res存储返回值
    19. res=MathMethod(-1,-1).add()
    20. print('-1+-1的结果是:',res)
    21. # 两个0相加
    22. def test_add_tow_zero(self):
    23. # 实例调用函数,使用res存储返回值
    24. res=MathMethod(0,0).add()
    25. print('0+0的结果是:',res)
    26. # 继承unittest里面的TestCase ,专门写用例,编写一个乘法测试用例
    27. class TestMulti(unittest.TestCase):
    28. # 编写测试用例
    29. # 1.一个用例就是一个函数 不能传参 只能有self关键字
    30. # 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
    31. def test_multi_tow_positive(self): # 两个正数相乘
    32. # 实例调用函数,使用res存储返回值
    33. res=MathMethod(1,1).multi()
    34. print('1*1的结果是:',res)
    35. def test_multi_tow_negative(self): # 两个负数相乘
    36. # 实例调用函数,使用res存储返回值
    37. res=MathMethod(-1,-1).multi()
    38. print('-1*-1的结果是:',res)
    39. # 执行测试用例
    40. if __name__ == '__main__':
    41. unittest.main()

    2.执行用例

    2-1.TestSuite 存储用例

    创建一个class_02.py文件,引用unittest和写好测试用例的class_01模块中的类。

    1. # 引入unittest
    2. import unittest
    3. # 引入class_01中的TestMathMethod类
    4. from Unittest_006.class_01 import TestMathMethod
    5. # A class whose instances are single test cases.
    6. # 这个类的实例是一个个单独的测试用例
    7. # 模块以外的地方要使用该测试用例时,需要创建实例
    8. # TestSuite和TestLoader 是类
    9. # TestSuite 存储用例的容器(用suite变量来存储用例)
    10. suite=unittest.TestSuite()
    11. # 创建测试用例时继承了unittest里面的TestCase ,专门用来写测试用例,TestCase有初始化函数,参数有methodName='runTest',即:
    12. # class TestCase(object):
    13. # def __init__(self, methodName='runTest'):
    14. # methodname就是函数名,也就是上传测试用例名
    15. # 创建实例 ---》实例.函数名(用例) ,用例需要调用TestMathMethod类中的测试用例----》用例=类(’用例名‘),建议用例少时可以使用
    16. suite.addTest(TestMathMethod('test_add_tow_positive'))
    17. suite.addTest(TestMathMethod('test_add_tow_negative'))
    18. runner=unittest.TextTestRunner()
    19. runner.run(suite)

    2-2.TestLoader 找用例,加载用例,存储到2-1的TestSuite

    2-2-1.从测试类里面去找测试用例

    1. import unittest
    2. from Unittest_006.class_01 import TestMathMethod
    3. # TestSuite 存储用例的容器(用suite变量来存储用例)
    4. # 存储用例用例的容器
    5. suite=unittest.TestSuite()
    6. # 创建一个加载器(寻找用例)
    7. loader=unittest.TestLoader()
    8. # 具体到类名;将寻找到的用例使用addTest方法加到suite容器里面,loadTestsFromTestCase(TestMathMethod)--->从测试名里面加载测试用例,即将TestMathMethod类里面的所有用例全部加载到addTest方法里面去
    9. suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))
    10. runner=unittest.TextTestRunner()
    11. runner.run(suite)

     2-2-2.从测试模块中去找测试用例

    1. import unittest
    2. #具体到模块名
    3. from Unittest_006 import class_01
    4. # 存储用例用例的容器
    5. suite=unittest.TestSuite()
    6. #创建一个加载器(寻找用例)
    7. loader=unittest.TestLoader()
    8. #loadTestsFromModule()--->从模块里面加载测试用例,此时需要引入需要的模块,在模块中找所有的用例
    9. suite.addTest(loader.loadTestsFromModule(class_01))
    10. runner=unittest.TextTestRunner()
    11. runner.run(suite)

    3.对比实际结果 预期结果 判定用例是否通过 (断言 Assert)

    对比实际测试结果与预期是否一致时,可以在用例中添加断言

    1. # unittest里面有专门写测试用例的TestCase
    2. import unittest
    3. # 导入自己写的方法,from...import,import后面至少具体到模块名,且一层层进入
    4. from Unittest_006.math_method import MathMethod #测试的目标
    5. # 继承unittest里面的TestCase ,专门写用例
    6. class TestMathMethod(unittest.TestCase):
    7. # 编写测试用例
    8. # 1.一个用例就是一个函数 不能传参 只能有self关键字
    9. # 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
    10. def test_add_tow_positive(self): # 两个正数相加
    11. # 实例调用函数,使用res存储返回值
    12. res=MathMethod(1,1).add() #实际发起请求的结果值
    13. print('1+1的结果是:',res)
    14. # 加一个断言:判断期望值与实际值得对比结果,一致通过,不一致失败
    15. self.assertEqual(2,res) # 函数之间的相互调用,类里面要调用属性的是self.属性名;类里面要调用函数是self.函数名();即assertEqual()来自于父类TestCase,
    16. if __name__ == '__main__':
    17. unittest.main()

    4.出具测试报告

    4-1.原始的测试报告

    1. import unittest
    2. # 引入HTMLTestRunner
    3. import HTMLTestRunner
    4. #具体到模块名
    5. from Unittest_006 import class_01
    6. # 存储用例用例的容器
    7. suite=unittest.TestSuite()
    8. #创建一个加载器(寻找用例)
    9. loader=unittest.TestLoader()
    10. #loadTestsFromModule()--->从模块里面加载测试用例,此时需要引入需要的模块,在模块中找所有的用例
    11. suite.addTest(loader.loadTestsFromModule(class_01))
    12. # 新建文件保存执行结果,使用上下文管理器:with 打开('text.txt','w+',encoding='utf-8')这个文件存到变量file里面
    13. # 不关闭文件会怎样? 不关闭文件有的时候要用文件时导致资源被占用
    14. with open('text.txt','w+',encoding='utf-8') as file: # 原始的测试报告
    15. # 执行
    16. runner=unittest.TextTestRunner(stream=file, verbosity=2) # stream输出渠道,verbosity有3个值0,1,2,其中2是最详细的
    17. runner.run(suite)
    18. # 判断file是否已经是关闭状态
    19. print(file.closed)

    4-2.用html形式展示测试报告

    需要引入HTMLTestRunner,python需要自己修改,可参考python3.x中导入HTMLTestRunner包_zyp--的博客-CSDN博客

    1. import unittest
    2. import HTMLTestRunner
    3. from Unittest_006 import class_01
    4. # 存储用例用例的容器
    5. suite=unittest.TestSuite()
    6. #创建一个加载器(寻找用例)
    7. loader=unittest.TestLoader()
    8. suite.addTest(loader.loadTestsFromModule(class_01))
    9. with open('text_report.html','wb')as file:
    10. runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title='2022年8月26日学习的测试报告', description='学习自动化测试的第一份测试报告',tester='暖暖')
    11. runner.run(suite)

  • 相关阅读:
    MySQL中的全表扫描和索引树扫描
    C语言数据结构---时间复杂度、空间复杂度
    HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作
    05※、Map集合介绍、HashMap、Hashtable、LinkedHashMap、Properties和Collections
    【Node.js从基础到高级运用】二、搭建开发环境
    Gavin Wood 演讲全文:建设更具韧性以应变化的 Polkadot
    Apache Hudi Timeline:支持 ACID 事务的基础
    自动跑测试记录后发送邮件提醒并自动解析数据
    【探索】HelloGitHub上面推荐几个程序我的真实体验与收藏
    初识Springboot
  • 原文地址:https://blog.csdn.net/weixin_47481102/article/details/126585435