引言
文章目录
一、TestLoader
1.1 概念
TestLoader
是 unittest
框架中的一个类,用于从测试模块、测试类或测试方法中加载测试用例。使用 TestLoader
可以更方便地发现和加载测试用例,而不需要手动将每个测试方法添加到 TestSuite
中
1.1.1 常见的 TestLoader
方法
loadTestsFromTestCase(testCaseClass)
: 从指定的测试类中加载所有测试方法loadTestsFromModule(module)
: 从指定的模块中加载所有测试类,并从这些类中加载所有测试方法loadTestsFromName(name, module=None)
: 从指定的名称(可以是模块名、类名或方法名)中加载测试discover(start_dir, pattern='test*.py', top_level_dir=None)
: 在指定目录及其子目录中查找并加载符合模式的所有测试文件
1.2 题目
如何使用testloader
1.3 代码
import unittest
suite = unittest.TestLoader().discover('./case', 'testcase*')
# run = unittest.TextTestRunner()
#
# run.run(suite)
unittest.TextTestRunner().run(suite)
输出结果:
1.4 代码解释
-
导入
unittest
模块:import unittest
- 这行代码导入了
unittest
模块,它是 Python 标准库中用于编写和运行单元测试的框架
- 这行代码导入了
-
使用
TestLoader
发现测试用例:suite = unittest.TestLoader().discover('./case', 'testcase*')
unittest.TestLoader()
创建了一个TestLoader
对象discover
方法用于在指定的目录中查找符合模式的测试文件,并将这些文件中的测试用例加载到一个TestSuite
中start_dir='./case'
:指定开始搜索的目录,这里是当前目录下的case
子目录pattern='testcase*'
:指定匹配的文件名模式,这里匹配所有以testcase
开头的.py
文件(例如testcase1.py
,testcase2.py
等)
suite
是一个TestSuite
对象,包含了从case
目录中发现的所有测试用例
-
运行测试套件:
# run = unittest.TextTestRunner() # run.run(suite) unittest.TextTestRunner().run(suite)
- 注释掉的部分展示了另一种创建
TextTestRunner
对象并运行测试套件的方法 unittest.TextTestRunner().run(suite)
直接创建TextTestRunner
对象并运行suite
中的测试用例TextTestRunner
是默认的测试运行器,它会在控制台上输出测试结果run
方法执行测试套件,并返回一个TestResult
对象,该对象包含了测试的结果信息
- 注释掉的部分展示了另一种创建
1.4.1 详细说明
-
TestLoader
的discover
方法:discover
方法会递归地搜索指定目录及其子目录中的测试文件,并根据给定的模式加载这些文件中的测试用例- 例如,假设
./case
目录下有以下结构:./case/ ├── __init__.py ├── testcase1.py ├── testcase2.py └── subdir/ ├── __init__.py └── testcase3.py
discover
方法会找到testcase1.py
,testcase2.py
和subdir/testcase3.py
中的所有测试用例,并将它们添加到TestSuite
中
-
TextTestRunner
的run
方法:TextTestRunner
是一个测试运行器,它负责执行测试套件并在控制台上输出结果。run
方法接收一个TestSuite
对象,并执行其中的所有测试用例- 测试结果会显示在控制台上,包括每个测试方法的名称、是否通过以及详细的错误信息(如果有的话)
二、Fixture
2.1 概念
-
setUp 和 tearDown:
setUp
方法在每个测试方法执行前被调用tearDown
方法在每个测试方法执行后被调用
-
setUpClass 和 tearDownClass:
setUpClass
方法在测试类中的所有测试方法执行前被调用一次tearDownClass
方法在测试类中的所有测试方法执行后被调用一次
-
setUpModule 和 tearDownModule:
setUpModule
方法在模块中的所有测试类执行前被调用一次tearDownModule
方法在模块中的所有测试类执行后被调用一次
2.2 题目
如何使用Fixture
2.3 代码
import unittest
class TestLogin(unittest.TestCase):
def setUp(self):
print('输入网址......')
def tearDown(self) -> None:
print('关闭当前页面......')
@classmethod
def setUpClass(cls) -> None:
print('------1. 打开浏览器')
@classmethod
def tearDownClass(cls) -> None:
print('------5. 关闭浏览器')
def test_1(self):
print('输入正确用户名密码验证码,点击登录 1')
def test_2(self):
print('输入错误用户名密码验证码,点击登录 2')
输出结果:
2.3 代码解释
这段python代码是使用unittest
框架编写的单元测试用例,专门用于测试登录功能。代码中定义了一个测试类TestLogin
,该类继承自unittest.TestCase
import unittest
这行代码导入了python标准库中的unittest
模块,它是一个用于编写和运行测试的框架
class TestLogin(unittest.TestCase):
这行代码定义了一个名为TestLogin
的类,用于包含登录功能的测试用例,它继承自unittest.TestCase
def setUp(self):
print('输入网址......')
setUp
方法是一个特殊的方法,它在每个测试方法执行之前都会被调用。在这个方法中,打印了“输入网址…”,这可能表示设置测试环境或初始化测试所需的步骤
def tearDown(self) -> None:
print('关闭当前页面......')
tearDown
方法也是一个特殊的方法,它在每个测试方法执行之后都会被调用。在这个方法中,打印了“关闭当前页面…”,这可能表示清理测试环境或执行测试后的清理工作
@classmethod
def setUpClass(cls) -> None:
print('------1. 打开浏览器')
setUpClass
是一个类方法,它使用@classmethod
装饰器标记。这个方法在所有测试方法执行之前只被调用一次。在这里,它打印了“------1. 打开浏览器”,表示在测试开始前打开浏览器的操作
@classmethod
def tearDownClass(cls) -> None:
print('------5. 关闭浏览器')
tearDownClass
也是一个类方法,它同样使用@classmethod
装饰器标记。这个方法在所有测试方法执行之后只被调用一次。它打印了“------5. 关闭浏览器”,表示在所有测试完成后关闭浏览器的操作
def test_1(self):
print('输入正确用户名密码验证码,点击登录 1')
这是一个测试方法,名为test_1
,它测试登录功能的一个方面:输入正确的用户名、密码和验证码,然后点击登录。在这个方法中,它只是打印了相应的操作说明
def test_2(self):
print('输入错误用户名密码验证码,点击登录 2')
这是另一个测试方法,名为test_2
,它测试登录功能的另一个方面:输入错误的用户名、密码和验证码,然后点击登录。同样,这个方法只是打印了相应的操作说明
三、思考
3.1 TestLoader
- 从
./case
目录中自动发现所有符合testcase*
模式的测试文件,并运行这些文件中的所有测试用例 - 测试结果会直接输出到控制台
- 这是一种非常方便的方式来管理和运行大量的测试用例,而无需手动指定每个测试类或方法
3.2 Fixture
setUp
和tearDown
方法在每个测试方法执行前后都会被调用setUpClass
和tearDownClass
方法在整个测试类开始前和结束后只被调用一次- 测试方法名必须以
test
开头,这样unittest
框架才能识别并运行它们 - 在实际的测试用例中,通常会有更多的断言(如
assertEqual
,assertTrue
等)来验证测试的结果是否符合预期,而不是仅仅打印操作说明