ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python-单元测试unittest

2021-12-12 17:33:00  阅读:141  来源: 互联网

标签:__ Python unittest 单元测试 单测 test 执行


单元测试介绍

单元测试没啥可介绍的,就是测试某一个确定的模块(粒度可以是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("这个单测会被忽略,不会执行")

标签:__,Python,unittest,单元测试,单测,test,执行
来源: https://www.cnblogs.com/-beyond/p/15679891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有