测试用例代码:
import unittest
from test_fk_math import TestCrazyitModule
import test_hello
test_cases = "TestHello"
def whole_suite():
# 创建测试加载器
loader = unittest.TestLoader()
# 创建测试包
suite = unittest.TestSuite()
# 从测试类中加载测试用例
tests = loader.loadTestsFromTestCase(test_hello.TestHello)
# 将测试用例添加到测试包中
suite.addTests(tests)
return suite
if __name__ == '__main__':
# 创建测试运行器
runner = unittest.TextTestRunner(verbosity=2)
runner.run(whole_suite())
输出到文件中:
if __name__ == '__main__':
# 创建测试运行器
'''
runner = unittest.TextTestRunner(verbosity=2)
runner.run(whole_suite())
'''
with open('fk_test_report.txt', 'a') as f:
# 创建测试运行器(TestRunner),将测试报告输出到文件中
runner = unittest.TextTestRunner(verbosity=2, stream=f)
runner.run(whole_suite())
hello.py
import unittest
from hello import *
class TestHello(unittest.TestCase):
# 测试say_hello函数
def test_say_hello(self):
self.assertEqual(say_hello(), "hello world.")
# 测试add函数
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
verbosity=1,2对比
运行测试
在编写完测试用例之后,可以使用如下两种方式来运行它们。
1.通过代码调用测试用例。程序可以通过调用unittest.main()来运行当前源文件中
的所有测试用例。例如,在上面的测试用例中增加如下代码.
if __name__ == '__main__':
unittest.main()
2.使用unittest模块运行测试用例。使用该模块的语法格式如下:
python -m unittest 测试文件
如果不指定文件,该命令将自动查找并运行当前目录下的所有测试用例。因此,程序也可直接使用如下命令来运行所有测试用例
3.result:
测试固件之setUp和tearDown:
重写setUpClass()和tearDown()类方法
import unittest
from hello import *
class TestHello(unittest.TestCase):
# 测试say_hello函数
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 测试add函数
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
@classmethod
def setUpClass(cls):
print("\n==========执行setUpClass在类级别模拟初始化测试固件=============")
@classmethod
def tearDownClass(cls):
print("\n==========执行setUpClass在类级别模拟销毁测试固件=============")
测试结果:
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest -v fixture_test2.py
==========执行setUpClass在类级别模拟初始化测试固件=============
test_add (fixture_test2.TestHello) ... ok
test_say_hello (fixture_test2.TestHello) ... ok
==========执行setUpClass在类级别模拟销毁测试固件=============
----------------------------------------------------------------------
Ran 2 tests in 0.002s
跳过测试
如果希望临时跳过某个测试用例,则可以通过如下
两种方式来实现
1.使用skipXxx装饰器来跳过测试用例。
unittest一共提供了3个装饰器,分别是@unittest.skip(reason),@unittest.skipif(condition.reason)和@unittest.skipUnless(condition,reason).其中skip代表无条件跳过,skipif代表condition为True时跳过,skipUnless代表当condition为False时跳过。
使用TestCase的skipTest()方法来跳过测试用例
方法1——@unittest.skip:
class TestHello(unittest.TestCase):
# 测试say_hello函数
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 测试add函数
@unittest.skip('临时跳过test_add')
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
python -m unittest skip_test1.py
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest skip_test1.py
sF
======================================================================
FAIL: test_say_hello (skip_test1.TestHello)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:\PythonProject\lesson\venv\com\lxy\crazyPy\16\skip_test1.py", line 8, in test_say_hello
self.assertEqual(say_hello(), "Hello World.")
AssertionError: 'Hello world.' != 'Hello World.'
- Hello world.
? ^
+ Hello World.
? ^
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1, skipped=1)
方法2——TestCase的skipTest():
class TestHello(unittest.TestCase):
# 测试say_hello函数
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 测试add函数
def test_add(self):
self.skipTest("临时跳过test_add")
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
python -m unittest -v skip_test2.py
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest -v skip_test2.py
test_add (skip_test2.TestHello) ... skipped '临时跳过test_add'
test_say_hello (skip_test2.TestHello) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK (skipped=1)
1.PyUnit是python自带的单元测试框架,用于编写和运行可重复的测试。PyUnit是xUnit体系的一个成员,xUnit是众多测试框架的总称,PyUnit主要用于进行白盒测试和回归测试。
2.PyUnit具有如下好处:
2.1可以使测试代码与产品代码分离
2.2针对某一个类的测试代码只需要进行较少的改动,便可以应用于另一个类的测试
2.3PyUnit开放代码,可以进行二次开发,方便对PyUnit的扩展
3.PyUnit是一个简单,易用的测试框架,其具有如下特征:
3.1使用断言方法判断期望值和实际值的差异,返回bool值
3.2测试驱动设备可使用共用的初始化变量或实例
3.3测试包结构便于组织和集成运行
4.测试注意事项
4.1测试方法应该没有返回值
4.2测试方法不应该有任何参数
4.3测试方法应以test_开头
4.4在测试某个方法时,如果实际测试要求达到某种覆盖程度,那么在编写测试用例时必须传入多组参数来进行测试,使得测试用例能达到指定的逻辑覆盖
5.TextTestRunner,它是一个测试运行器,专门用于运行测试用例和测试包。其实前面使用的unittest.main()函数,同样也是通过
创建TextTestRunner时还指定了verbosity=2,这样可以生成更详细的测试信息