Python unittest使用

一:避坑点

1、使用unittest时,默认不会执行if __name__ == '__main__':,而是以“Run 'Unittests in XXX' ”方式运行。

我们需要通过menu:Run->Edit Configurations打开配置窗口,在Python下,新建一个运行方式case_python(名字自取),将运行的脚本加入,保存后,以此方式运行测试脚本,就能进入方法if __name__ == '__main__':。

 

script path填入脚本的路径。Working directory填入项目的根目录。

2、进入方法if __name__ == '__main__':,我们可以添加自定义的测试顺序,或者将测试结果输出到外部文件或html文件中。

二:自定义测试case执行顺序

1、if __name__ == '__main__':中,可以通过TestSuite定义case执行顺序

suite = unittest.TestSuite()
suite.addTest(TestCreateTask("test_02"))
suite.addTest(TestCreateTask("test_01"))

2、定义TestCase时,可以通过case的名称来定义执行顺序

如:def test_01(self)、def test_02(self)

能通过名称来确定执行顺序的原因是:unittest源码getTestCaseNames对测试用例的名称进行了排序,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。

三:将测试结果输出到外部文件

if __name__ == '__main__':
    # 安装顺序执行case
    suite = unittest.TestSuite()
    suite.addTest(TestCreateTask("test_02"))
    suite.addTest(TestCreateTask("test_01"))
    # 执行结果输出到外部文件
    with open("unit_test_result.txt", "w") as f:
        # verbosity = 2 查看完成的执行情况
        # verbosity默认为1,可以设置为0和2。
        # 0 (静默模式): 你只能获得总的测试用例数和总的结果。
        # 1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
        # 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果

        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(suite)

四:将测试结果生成Html文件

import unittest

from test_unit import TestCreateTask

from HTMLTestRunner import HTMLTestRunner

if __name__ == '__main__':

suite = unittest.TestSuite() suite.addTest(TestCreateTask("test_02")) suite.addTest(TestCreateTask("test_01"))

    with open('HTMLReport.html', 'w') as f:
        runner = HTMLTestRunner(stream=f,
                                title='TestCreateTaskTest Report',
                                description='generated by HTMLTestRunner.',
                                verbosity=2
                                )
        runner.run(suite)

 五:完整的unittest case使用实例

1、一个class继承了unittest.TestCase,便是一个测试用例,但如果其中有多个以 test 开头的方法,那么每有一个这样的方法,在load的时候便会生成一个TestCase实例。

import unittest

class TestCreateTask(unittest.TestCase):
    # 测试前准备,该方法一个测试用例,只执行一次
    @classmethod
    def setUpClass(cls):
        print('******** Test Start ********')
    # 用来清理环境,已备之后的测试,该方法一个测试用例,只执行一次
    @classmethod
    def tearDownClass(cls):
        print('******** Test End ********\n')
    # 测试前准备,测试实例的每个测试case执行一次
    def setUp(self):
        set_test_data()

    # 用来清理环境,已备之后的测试,测试实例的每个case执行一次
    def tearDown(self):
        pass
    # case2
    def test_02(self):
        self.assertEqual(24,2)    
    # case1
    def test_01(self):
        self.assertEqual(24,3) 

if __name__ == '__main__':
    # 安装顺序执行case suite = unittest.TestSuite() suite.addTest(TestCreateTask("test_02")) suite.addTest(TestCreateTask("test_01")) # 执行结果输出到外部文件 with open("unit_test_result.txt", "w") as f: # verbosity = 2 查看完成的执行情况
  # verbosity默认为1,可以设置为0和2。
  # 0 (静默模式): 你只能获得总的测试用例数和总的结果。
        # 1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
  # 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果
runner = unittest.TextTestRunner(stream=f, verbosity=2)

runner.run(suite)

六:unittest核心工作原理

 

 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture

一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

而对一个测试用例环境的搭建和销毁,是一个fixture。
————————————————
版权声明:本文为CSDN博主「huilan_same」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huilan_same/article/details/52944782

七:unittest的skip装饰器

skip装饰器一共有三个 unittest.skip(reason)、unittest.skipIf(condition, reason)、unittest.skipUnless(condition, reason),skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。

@unittest.skip("I don't want to run this case.")

def test_divide(self):

"""Test method divide(a, b)"""

print "divide"
————————————————
版权声明:本文为CSDN博主「huilan_same」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huilan_same/article/details/52944782 

八:断言Assert----结果对比的函数 

Method

Checks that

New In

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:判断是否是同一对象(id(a))

3.1

asserNottIs(a,b)

a is not b

3.1

assertIsNone(x)

x is None

3.1

assertIsNotNone(x)

x is not None

3.1

assertIn(a,b):a是否在b中

a in b

3.1

assertNotIn(a,b)

a not in b

3.1

assertIsInstance(a,b):实例对象

isInstance(a,b)

3.2

assertNotIsInstance(a,b)

not isInstance(a,b)

3.2


版权声明:本文为antch620原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。