02. UnitTest基本使用
2024年10月28日大约 5 分钟
02. UnitTest基本使用
1. TestCase(测试用例)
1. 如何定义测试用例?
案例: 定义一个实现加法操作的函数,并对该函数进行测试
步骤
导包:import unittest
定义测试类:只要继承 unittest.TestCase 类, 就是测试类
定义测试方法:方法中的代码就是真正用例代码, 方法名必须以 test 开头
执行
- 方式一:使用pycharm在代码上点击鼠标右键,选择使用UnitTest运行(整个测试类、测试类中的某个测试方法)
- 方式二:调用 unittest.main() 来运行
"""
testcase_demo1.py
TestCase(测试用例) 的使用
"""
# 1. 导包 unittest
import unittest
# 2. 定义测试类:只要(必须)继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
# 3. 定义测试方法:方法中的代码就是真正用例代码, 方法名必须以 test 开头
def test_method1(self):
print('测试方法一')
def test_method2(self):
print('测试方法二')
# 4. 执行
# 方式一
# 4.1 在类名或者方法名后边右键运行
# 4.1.1 在类名后边, 执行类中的所有的测试方法
# 4.1.2 在方法名后边, 只执行当前的测试方法
# 方式二
# 4.2 在主程序使用使用 unittest.main() 来执行,
if __name__ == '__main__':
unittest.main()
2. 可能出现的问题
- ⽂件名包含中⽂
右键运⾏ 没有 unittest for ....
解决方法
解决⽅案⼀
- 新建⼀个代码⽂件, 将之前的代码复制过来
解决⽅案二
# 在主程序使⽤使⽤ unittest.main() 来执⾏, if __name__ == '__main__': unittest.main()
解决⽅案三
思考:针对一个大型的项目,我们会编写很多很多的测试用例(并且会定义到不同的python文件中),那么如何同时运行多个测试用例,如何批量执行测试用例??
2. TestSuite(测试套件)
TestSuite(测试套件)
- 将多条⽤例脚本集合在⼀起,就是套件, 即⽤来组装⽤例的
使用步骤
实例化测试套件:suite = unittest.TestSuite()
添加用例:
方式一:一次添加一个
- suite.addTest(ClassName("MethodName"))
- ClassName:为类名;MethodName:为方法名
- suite.addTest(ClassName("MethodName"))
方式二:一次添加整个测试类(把指定ClassName类中的测试用例全部添加到测试套件中)
- 方式一:suite.addTest(unittest.makeSuite(ClassName))
- 方式二:suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(ClassName))
# hm_02_testcase1.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo1(unittest.TestCase):
# 3. 书写测试方法, 方法中的代码就是真正用例代码, 方法名必须以 test 开头
def test_method1(self):
print('测试方法1-1')
def test_method2(self):
print('测试方法1-2')
# hm_02_testcase2.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是 测试类
class TestDemo2(unittest.TestCase):
# 3. 书写测试方法, 方法中的代码就是真正用例代码, 方法名必须以 test 开头
def test_method1(self):
print('测试方法2-1')
def test_method2(self):
print('测试方法2-2')
注意:TestSuite需要配合TestRunner才能被执行
代码见下章节
3. TestRunner(测试执行)
- TestRunner(测试执行)
- 用来执行测试用例和测试套件
- 步骤
- 实例化:runner = unittest.TextTestRunner()
- 执行:runner.run(suite)
- suite:为测试套件对象名称
# hm_03_testsuite_testrunner1.py
"""
- TestSuite(测试套件): 用来管理组装(打包)多个TestCase的
- TestRunner(测试执行): 用来执行TestSuite的
"""
# 1. 导包 unittest
import unittest
from hm_02_testcase1 import TestDemo1
from hm_02_testcase2 import TestDemo2
# 2. 实例化套件对象 unittest.TestSuite()
# TestSuite(测试套件): 多条测试用例集合在一起就是一个测试套件
# TestSuite需要配合TestRunner才能被执行
suite = unittest.TestSuite()
# 3. 添加用例方法
# 3.1 套件对象.addTest(测试类名('测试方法名')) # 建议复制
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
# 4. 实例化 执行对象 unittest.TextTestRunner()
runner = unittest.TextTestRunner()
# 5. 执行对象执行 套件对象 执行对象.run(套件对象)
runner.run(suite)
# hm_03_testsuite_testrunner2.py
# 1. 导包 unittest
import unittest
from hm_02_testcase1 import TestDemo1
from hm_02_testcase2 import TestDemo2
# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestSuite()
# 3. 添加用例方法
# 3.2 添加整个测试类
# 套件对象.addTest(unittest.makeSuite(测试类名)) # 在不同的 Python 版本中,可能没有提示
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
# 或者
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestDemo1))
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestDemo2))
# 4. 实例化 执行对象 unittest.TextTestRunner()
runner = unittest.TextTestRunner()
# 5. 执行对象执行 套件对象 执行对象.run(套件对象)
runner.run(suite)
思考:假如说有1000个文件,那我岂不是要添加1000次?!
4. TestLoader(测试加载)
1. TestLoader(测试加载)
- 用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件。
- 使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
- 作⽤和 TestSuite 作⽤⼀样,组装⽤例代码, 同样也需要使⽤TextTestRunner() 去执⾏
2. 用法
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
"""
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
"""
# 注意:最终返回的还是测试套件对象,运行测试套件还需要使用TestRunner
# hm_04_testloader1.py
import unittest
"""
TestLoader(测试加载):
是对TestSuite的功能补充,管理、组装(打包)多个TestCase的
比如: 如果TestCase的代码文件有很多
"""
# 实例化加载对象并加载用例,得到套件对象
# suite = unittest.TestLoader().discover('用例所在的目录', '用例代码文件名*.py')
suite = unittest.TestLoader().discover('..', 'hm_02*.py')
# 实例化执行对象并执行
# runner = unittest.TextTestRunner()
# runner.run(suite)
# 简写
unittest.TextTestRunner().run(suite)
# hm_04_testloader2.py
import unittest
suite = unittest.TestLoader().discover('case', 'test*.py')
unittest.TextTestRunner().run(suite)
3. TestLoader与TestSuite区别
TestSuite
- 优点:
- 灵活
- 方便控制要执行的测试用例
- 缺点:
- 需要手动添加测试用例
- 优点:
TestLoader
- 优点:
- 可以自动搜索满足条件的测试用例
- 缺点:
- 不方便控制要执行的测试用例
- 优点: