unittest断言的使用

断言使用

  • 咱们能够直接在测试用例里面添加unittest框架自带的断言(也就至关于判断),断言方法提供了测试结果是True仍是False,全部的断言方法都有一个msg参数,若是指定msg参数的值,则将该信息做为失败的错误信息返回;html

  • 若是断言失败则抛出一个AssertionError,并标识该测试为失败状态;若是成功,则标识该测试为成功状态;若是异常,则当作错误来处理;框架

先来看一个实例,在一个测试类MyTestCase中添加多个测试方法和断言less

from unittest import TestCase, main, skip
class MyTestCase(TestCase):
    def setUp(self):
        print('setUp')
    def tearDown(self):
        print('tearDown')
    def test_print1(self):
        print('第一个测试用例')
        # unittest框架自带的断言,若是不相等,直接抛出异常,相等什么都不作
        self.assertEqual(200, 200, '测试失败')
    def test_print2(self):
        print('第二个测试用例')
    def test_print3(self):
        print('第三个测试用例')
if __name__ == '__main__':
    main()

========输出========:
setUp
第一个测试用例
tearDown
setUp
第二个测试用例
tearDown
setUp
第三个测试用例
tearDown

这里有三个测试用例,每一个测试用例开始以前都先执行了setUp方法,每一个测试用例以后都执行了tearDown方法。若是咱们想要忽略某个测试用例不执行,要怎么作?好比忽略第三个测试用例,只须要在第三个测试用例以前加上skip装饰器:函数

@skip('do not need test_print3')
    def test_print3(self):
        print('第三个测试用例')

skip装饰器

  • 咱们可使用unitest.skip装饰器跳过不须要的测试用例,@unittest.skip(reason)表示无条件跳过测试用例,reason是用来讲明缘由的;学习

  • @unittest.skipIf(conditition,reason):condititon为true时跳过测试用例;测试

  • @unittest.skipunless(condition,reason):condition为False时跳过测试用例;ui

以前咱们学习了setup方法和setUpClass方法,会在每一个测试用例的先后都执行一遍,那若是咱们只想要在全部测试用例的先后执行一遍,也就是在整个类中只执行一遍要怎么办呢,咱们可使用setUpClass方法和tearDownClass方法:code

from unittest import TestCase, main, skip
class MyTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        print('setUpClass')
    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')
    def test_print1(self):
        print('第一个测试用例')
        # unittest框架自带的断言,若是不相等,直接抛出异常,相等什么都不作
        self.assertEqual(200, 200, '测试失败')
    def test_print2(self):
        print('第二个测试用例')

    @skip('do not need test_print3')
    def test_print3(self):
        print('第三个测试用例')
if __name__ == '__main__':
    main()


==========输出===========
setUpClass
第一个测试用例
第二个测试用例
tearDownClass

setUpClass和tearDownClass的使用

  • setup方法和teardown方法在每次执行一个测试用例时都会从新执行一遍,因此要想在整个类中只执行一遍能够用setUpClass和tearDownClass方法;htm

  • setUpClass:须要添加@classmethod 装饰器,在一个类中只会在全部测试用例运行前调用一次;ip

  • tearDownClass:须要添加@classmethod 装饰器,在全部测试用例运行后调用一次;

引入测试用例集,将测试用例与测试集合分开

  • 首先能够先在一个文件中写好测试用例模块,而后在另外一个文件中导入这个模块,再使用unittest.TestSuite类建立测试套件,而后使用这个类的addTest() 方法将须要被测试的测试用例添加到测试套件中,最后使用unittest.TextTestRunner类中的run()方法来运行suite所组装的测试用例;
  • 测试用例模块
from unittest import TestCase
from unittest import skip
from unittest import main as main_method
class MyTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        print('setUpClass')
    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')
    def test_print1(self):
        print('第一个测试用例')
        self.assertEqual(200, 200, '测试失败')
    def test_print2(self):
        print('第一个测试用例')

    @skip('do not need test_print3')
    def test_print3(self):
        print('第一个测试用例')
if __name__ == '__main__':
    main_method()
  • 测试集模块
from test1 import MyTestCase
from unittest import TestSuite, TextTestRunner
suite = TestSuite()
# 在测试用例集中添加测试用例, 只添加两个测试的方法
suite.addTest(MyTestCase('test_print1'))
suite.addTest(MyTestCase('test_print3'))
if __name__ == '__main__':
    # 建立测试runner,执行测试用例集
    runner = TextTestRunner()
    runner.run(suite)

=========输出=============
setUpClass
第一个测试用例
tearDownClass

咱们运行这段代码,只有第一个测试用例输出,由于咱们只将第一个和第三个测试用例加入到测试集中,全部第二个测试用例不会执行,而咱们在第三个测试用例前面机上了skip装饰器会跳过此测试用例,全部第三个也不会执行啦。

将待测试函数、测试用例、测试用例集分开

  • 将待测试函数、测试用例、测试用例集分别放在不一样的文件中,先在测试用例中导入待测试函数,而后使用断言判断函数是否正确,接着在测试用例集中创健测试套件,且将测试用例加入套件里面,最后运行;
  • 测试函数
def add(x, y):
    return x + y
def sub(x, y):
    return x - y
  • 测试用例
from unittest import TestCase
from unittest import skip
from unittest import main as main_method
from add_sub import add, sub

class MyTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        print('setUpClass')
    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')
    def test_print1(self):
        ret = 1 + 2
        result = add(1, 2)
        self.assertEqual(result, ret, 'test_print1测试失败')

    def test_print2(self):
        print('第二个测试用例')

    @skip('do not need test_print3')
    def test_print3(self):
        print('第三个测试用例')
        
if __name__ == '__main__':
    main_method()
  • 测试用例集
from test import MyTestCase
from unittest import TestSuite, TextTestRunner
suite = TestSuite()
# 在测试用例集中添加测试用例
suite.addTest(MyTestCase('test_print1'))
suite.addTest(MyTestCase('test_print2'))
suite.addTest(MyTestCase('test_print3'))

if __name__ == '__main__':
    
    # 建立测试runner,执行测试用例集
    runner = TextTestRunner()
    runner.run(suite)

========输出=========
setUpClass
第一个测试用例
第二个测试用例
tearDownClass

参考:https://www.9xkd.com/user/plan-view.html?id=4822012440

相关文章
相关标签/搜索