zoukankan      html  css  js  c++  java
  • Python单元测试unittest

    单元测试介绍

    单元测试没啥可介绍的,就是测试某一个确定的模块(粒度可以是class级别,也可以是func级别)的功能是否符合预期。本文介绍python的unittest模块时,主要是和Javajunit进行对比。

    python的单测和JavaJunit用法很像,只不过还是有一些细微的区别的。

    Junit里面,通常有下面几个特点:

    1. 单元测试类一般命名都是XxxxTest,当然也可以不遵守;
    2. 单元测试使用@Test来标记一个单元测试方法,如果没有用该注解的话,就是一个普通的方法;

    而在python里面,则有以下特点

    1. 单元测试类命名一般都是xxx_test,当然也可以不遵守;
    2. 单元测试类需要继承unittest.TestCase类,这样才会将该类标识为一个单测类

    单元测试的方法,并不是使@Test装饰器来标识,而是使用以test开头的方法来标识(区分大小写),比如test1()test_1()testIt()这些都是单元测试方法,但是TestIt()tEstIt()这样的就是不是,因为前缀要完全匹配test

    使用示例

    # coding:utf-8
    import unittest
    
    
    # 单元测试类要继承unittest模块的TestCase类
    class UnitTestDemo(unittest.TestCase):
    
        # 单元测试方法要以小写test前缀开头
        def test_echo(self):
            print("hello unit test")
    
        def not_a_test_func(self):
            print("run not_a_test_func")
    
    # 使用unittest.main()触发所有单测方法的执行
    if __name__ == '__main__':
        unittest.main()
    

    如果使用IDEA,那么每个单测方法都会出现可执行的按钮,直接点击执行即可。

    单元测试的前置操作与后置操作

    Junit里面有@before@beforeClass@after@afterClass注解,这几个注解可以在单元测试方法前后执行一些操作,比如单测执行前的初始化和单测执行后的清理操作;

    其中@before@after这两个注解标注的方法,会在每个单测执行前后执行;而@beforeClass@afterClass标注的方法,只会执行一次,@beforeClass是在所有单测执行前执行,@afterClass会在所有单测执行后才执行。

    Python也有这样的功能,只不过不是通过装饰器方式实现的,而是通过固定的方法名来实现的。

    1. setUp()会在每个单元测试方法的执行前执行,若有多个单测方法,则会执行多次;
    2. tearDown()会在每个单元测试方法的执行后才执行,如果有多个单测方法,则会执行多次;
    3. setUpClass()会在所有测试方法执行前执行一次,然后就不再执行了,需要使用@classmethod装饰器将其标识为静态方法;
    4. tearDownClass会在所有测试方法都执行完后才执行,且只执行一次,需要使用@classmethod装饰器将其标识为静态方法;
    # coding:utf-8
    import unittest  # 导入单元测试模块
    
    class MyFuncTest(unittest.TestCase):
    
        # setUpClass方法,所有单测方法执行前,只执行一次
        @classmethod
        def setUpClass(cls):
            print("setUpClass static method")
    
        # setUp方法,每个单测方法执行前都会执行一次
        def setUp(self):
            print("setUp method")
    
        def tearDown(self):
            print("tearDown method")
    
        @classmethod
        def tearDownClass(cls):
            print("tearDownClass method")
    
        # test开头的方法是单元测试方法
        def test_echo_1(self):
            print("this is test_echo_1")
    
        def test_echo_2(self):
            print("this is test_echo_2")
    
    
    # 入口,调用unittest.main()方法即可,单元测试模块会自动运行上面的单测
    if __name__ == '__main__':
        unittest.main()
    

    上面的单测运行后输出如下:

    setUpClass static method
    setUp method
    this is test_echo_1
    tearDown method
    setUp method
    this is test_echo_2
    tearDown method
    tearDownClass method
    

    assert断言

    python里面也支持断言的功能,由于单元测试类继承了TestCase类,那么就可以直接使用断言方法,使用方式如下:

    # coding:utf-8
    import unittest  # 导入单元测试模块
    
    class MyFuncTest(unittest.TestCase):
    
        def test_check(self):
            i = 10
    
            # 可以直接使用python的关键字
            assert i > 9
    
            # 使用unittest的断言
            self.assert_(i > 9, "i不大于9")
            # 等级于
            # self.assertTrue(i > 11)
    
            self.assertLess(i, 11, "i小于11")
    
    
    # 入口,调用unittest.main()方法即可,单元测试模块会自动运行上面的单测
    if __name__ == '__main__':
        unittest.main()
    
    

    忽略执行

    某些情况下,我们不希望某个单元测试方法执行,那么我们可以将其注释掉或者将其名称改成不以test关键字开头,而另外一种方式是使用@unittest.skip装饰器来表示不需要执行该单测方法

    # 使用@unittest.skip装饰器,可将单测忽略(不会执行)
    @unittest.skip("这是忽略测试的原因")
    def test_skip_method(self):
    	print("这个单测会被忽略,不会执行")
    
    如需转载,请注明文章出处,谢谢!!!
  • 相关阅读:
    越狱-监狱地图
    老K说故事系列(003)
    老K说故事系列(001)
    面向对象软件开发培训
    别让思想老去,重燃激情火焰
    软件产品界面设计-培训PPT发布
    读“道法自然”的非技术有感
    老K说故事系列(002)
    游戏规则
    基于C# Socket实现多人网络聊天室
  • 原文地址:https://www.cnblogs.com/-beyond/p/15679891.html
Copyright © 2011-2022 走看看