python3 unittest 断言_unittest断言的使用

### 断言使用

* 我们可以直接在测试用例里面添加unittest框架自带的断言(也就相当于判断),断言方法提供了测试结果是True还是False,所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回;

* 如果断言失败则抛出一个AssertionError,并标识该测试为失败状态;如果成功,则标识该测试为成功状态;如果异常,则当做错误来处理;

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

```

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时跳过测试用例;

之前我们学习了setup方法和setUpClass方法,会在每个测试用例的前后都执行一遍,那如果我们只想要在所有测试用例的前后执行一遍,也就是在整个类中只执行一遍要怎么办呢,我们可以使用setUpClass方法和tearDownClass方法:

```

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方法;

* `setUpClass`:需要添加@classmethod 装饰器,在一个类中只会在所有测试用例运行前调用一次;

* `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](https://www.9xkd.com/user/plan-view.html?id=4822012440)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值