美文网首页
unittest学习

unittest学习

作者: 瘦不下去了 | 来源:发表于2020-02-22 17:10 被阅读0次

    一、什么是单元测试&单元测试的对象

    1.定义:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作
    2.单元测试中最核心的四个概念:test case(测试用例),test suite(测试套件),test runner(测试运行器),test fixture(测试环境数据准备和数据清理或者测试脚手架)
     1)test case:一个testcase的实例就是一个测试用例。测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)
     2)TestSuite:多个测试用例集合在一起。
     3)TestLoader:用来加载Testcase到TestSuite中。
     4)TextTestRunner:用来执行测试用例,其中run(test)会执行TestSuite/TestCase中的run(result)方法。
     5)test fixture:测试用例环境的搭建和销毁

    image.png
    综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

    二、初级使用

    1.步骤

     1)导入unittest模块,被测文件或者其中的类
     2)创建一个测试类,被继承unittest.TestCase
     3)重写setUp和tearDown方法(如果有初始化条件和结束条件)
     4)定义测试函数,函数名以test_开头
     5)在函数体中使用断言来判断测试结果是否符合预期结果
     6)调用unittset.main()方法运行测试用例--------无此方法也是可以运行

    2.使用setUp和tearDown方法,每次执行测试用例都会执行初始化化条件和结束条件

    image.png

    由代码看到,每次执行用例前都会执行初始化条件和结束条件,两个测试用例,共执行了两次初始化条件和结束条件。

    3.设置setupClass和teardownClass:执行所有测试用例,仅执行一次初始化条件和结束条件

    image.png

    4.断言Assert----结果对比的函数

    Method Checks that
    assertEqual(a,b):相等 a==b
    assertNotEqual(a,b) a!=b
    assertTrue(x) bool(x) is True
    assertFalse(x) bool(x) is False
    assertIs(a,b) a is b 判断是否是同一现象
    assertIsNot(a,b) a is not b
    assertIsNone(x) x is None
    assertIsNotNone(x) x is not None
    assertIn(a,b):a是否在b中 a in b
    assertNotIn(a,b) a not in b
    assertIsInstance(a,b):实例对象 isInstance(a,b)
    assertNotIsInstance(a,b) not isInstance(a,b)

    设置断言,当某条测试用例执行失败,不会影响其他测试用例的执行


    image.png image.png

    也可以直接用 ==,!=,<=,>=来判断


    image.png

    写一个方法,通过unittest来执行


    image.png
    image.png

    三、进阶使用

    1.TestSuite:

     addTest():添加单个测试用例
     addTests([,,]):添加多个测试用例


    image.png

    2.addTest的参数:是一个测试用例的列表

     1. 方式一:类名(‘方法名’)的集合
     2.方式二:unittest.TestLoader.discover方法匹配目录下的用例-----用的最多的,测试用例在一个目录下
    discover方法中默认匹配模式是从当前目录下找以test开头的py文件。测试用例的顺序执行是根据字母a-z,0-9的顺序执行的。
     3.方式三:unittest.TestLoader.loadTestsFromModule匹配模块中的测试用例
    PS:TestLoader类、TestSuite类、TestRunner类需要先实例化再使用

    如下是一个单元测试的实例


    image.png
    #实例:采用unittest.TestLoader.discover方式加载测试用例。
    ######定义函数:Myclass_test.py
    class Myclass_Test():
    
        def __init__(self,a,b):
            self.a = a
            self.b = b
    
        def sum(self):
            sum = self.a + self.b
            return sum
    
        def sub(self):
            sub = self.a - self.b
            return sub
    
    ######定义测试类1:test_Myclass1.py
    import unittest
    from my_Unittest import Myclass_test
    
    class Test_myclass(unittest.TestCase):
    
        def setUp(self):
            self.myclass = Myclass_test.Myclass_Test(11,10)
    
        def test_sum(self):
            sum = self.myclass.sum()
            print('class1sum = '+str(sum))
            self.assertEqual(21,sum)
    
        def test_sub(self):
            sub = self.myclass.sub()
            print('class1sub = '+str(sub))
            self.assertNotEqual(10,sub)
    
    ######定义测试类2:test_Myclass2.py
    import unittest
    from my_Unittest import Myclass_test
    
    class Test_myclass(unittest.TestCase):
    
        def setUp(self):
            self.myclass = Myclass_test.Myclass_Test(1,10)
    
        def test_sum(self):
            sum = self.myclass.sum()
            print('class2sum = '+str(sum))
            self.assertEqual(11,sum)
    
        def test_sub(self):
            sub = self.myclass.sub()
            print('class2sub = '+str(sub))
            self.assertNotEqual(10,sub)
    
    ######主函数的调用:Myclass_main.py
    import unittest
    import os
    
    #实例化测试套件对象
    s = unittest.TestSuite()
    #实例化TestLoader的对象
    loader = unittest.TestLoader()
    #使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
    s.addTests(loader.discover(os.getcwd()))
    run = unittest.TextTestRunner()
    run.run(s)
    

    3.测试报告的生成

    第一种:text文件----写到txt文件中

    #第一种:unittest自带的方法
    #创建一个文件,以写的方式打开
    
    import unittest
    import os
    
    #实例化测试套件对象
    s = unittest.TestSuite()
    #实例化TestLoader的对象
    loader = unittest.TestLoader()
    #使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
    s.addTests(loader.discover(os.getcwd()))
    fs  = open('test_run_report.txt','w')
    run = unittest.TextTestRunner(fs)
    run.run(s)
    

    第二种:html测试报告
    需下载HTMLTestRunner.py文件,http://tungwaiyip.info/software/HTMLTestRunner.html
    下载后放到Python安装目录的Lib目录下即可。同时需修改文件中部分内容,附上链接:https://www.cnblogs.com/hellomaster/p/11040277.html

    image.png
    HTMLTestRunner参数详解:
    verbosity
    =1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’
    =0的时候。不输出信息
    =2的时候,需要打印详细的返回信息
    --stream:测试报告写入文件的存储区域
    --title:测试报告的主题
    --description:测试报告的描述
    import os
    from HTMLTestRunner import *
    
    #  实例化测试套件对象
    s = unittest.TestSuite()
    #  实例化TestLoader的对象
    loader = unittest.TestLoader()
    #  使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
    s.addTests(loader.discover(os.getcwd()))
    with open(os.getcwd() +"/test_report.html","wb") as fp:
        runner = HTMLTestRunner(
            stream=fp,
            verbosity=1,
            title="测试报告标题",
            description="测试报告描述信息",
        )
        runner.run(s)
    
    
    

    HTMLTestRunner踩坑记录:
    1、导入的时候,尽量写成from HTMLTestRunner import *,如果是import HTMLTestRunner,那么下面调用的时候,要写成HTMLTestRunner.HTMLTestRunner

    image.png
    https://www.cnblogs.com/hellomaster/p/11040277.html

    2、使用with open写入文件的时候,runner.run要放在with open里面
    https://www.cnblogs.com/chuiyuedefeng/p/11902018.html

    3、因为写入的是二进制文件,所以写入方式要用wb,使用w会报错
    https://blog.csdn.net/kingyuan666/article/details/81214954

    相关文章

      网友评论

          本文标题:unittest学习

          本文链接:https://www.haomeiwen.com/subject/ziokqhtx.html