使用TestTextRunner(suite)执行用例时会执行个人编写的装饰器跳过用例;使用Beautifulreport(suite)时,不会执行装饰器跳过用例 为什么
时间: 2024-04-04 07:29:49 浏览: 51
这可能是因为TestTextRunner和Beautifulreport在执行测试套件时使用了不同的方法。TestTextRunner是unittest框架自带的测试运行器,它会按照测试套件中的顺序逐个执行测试用例,并在执行前会检查是否有装饰器跳过该用例。而Beautifulreport是第三方测试报告库,它可能是直接调用了unittest框架中的run()方法来执行测试套件,并在执行时可能没有检查装饰器跳过用例的情况。
另外,对于装饰器跳过用例的实现方式可能也会影响TestTextRunner和Beautifulreport的执行结果。如果装饰器是使用unittest提供的@unittest.skip()装饰器,那么TestTextRunner和Beautifulreport都应该能正常跳过用例。但如果装饰器是使用自定义的装饰器实现的,那么TestTextRunner可能无法识别该装饰器,而Beautifulreport则可能能够正常执行用例。
综上,可能是TestTextRunner和Beautifulreport在执行测试套件时使用了不同的方法,并且装饰器跳过用例的实现方式也可能会影响它们的执行结果。
相关问题
suite = unittest.TestSuite() suite.addTest(MyTestCase('test_addition')) suite.addTest(MyTestCase('test_subtraction')) 执行用例写入beautifulreport
可以按照以下步骤执行用例并将结果写入beautifulreport:
1. 导入unittest和beautifulreport库:
```python
import unittest
from BeautifulReport import BeautifulReport
```
2. 创建测试套件并添加测试用例:
```python
suite = unittest.TestSuite()
suite.addTest(MyTestCase('test_addition'))
suite.addTest(MyTestCase('test_subtraction'))
```
3. 运行测试并生成beautifulreport:
```python
result = BeautifulReport(suite)
result.report(filename='test_report', description='Test Report', log_path='./')
```
其中,filename为报告文件名,description为报告描述,log_path为报告保存路径。执行完毕后,将在log_path路径下生成一个名为test_report.html的测试报告。
装饰器如何顺序执行用例
如果你想控制装饰器的执行顺序来影响测试用例的行为,可以使用 `unittest` 模块提供的 `TestSuite` 类。你可以将测试用例添加到一个 `TestSuite` 对象中,并按照你希望它们执行的顺序添加装饰器。
例如,假设你有三个测试用例 `test_case1`、`test_case2` 和 `test_case3`,并且你希望它们按照以下顺序执行:
1. `test_case1`
2. `test_case2`,在运行之前需要先执行一个装饰器 `setup_test_case2`
3. `test_case3`,在运行之前需要先执行两个装饰器 `setup_test_case2` 和 `setup_test_case3`
你可以使用以下代码来实现:
```python
import unittest
class MyTestCase1(unittest.TestCase):
def test_case1(self):
# test code goes here
class MyTestCase2(unittest.TestCase):
def test_case2(self):
# test code goes here
def setUp(self):
# setup code goes here
def setup_test_case2(test_case):
def wrapper(*args, **kwargs):
test_case.setUp()
# additional setup code goes here
return test_case(*args, **kwargs)
return wrapper
class MyTestCase3(unittest.TestCase):
def test_case3(self):
# test code goes here
def setUp(self):
# setup code goes here
def setup_test_case3(test_case):
def wrapper(*args, **kwargs):
test_case.setUp()
# additional setup code goes here
return test_case(*args, **kwargs)
return wrapper
# create a TestSuite object
suite = unittest.TestSuite()
# add test cases in the desired order
suite.addTest(MyTestCase1('test_case1'))
suite.addTest(MyTestCase2('test_case2'))
suite.addTest(MyTestCase3('test_case3'))
# add decorators to the test cases in the desired order
suite._tests[1]._testMethodName = 'run_test_case2'
suite._tests[1] = setup_test_case2(suite._tests[1])
suite._tests[2]._testMethodName = 'run_test_case3'
suite._tests[2] = setup_test_case2(setup_test_case3(suite._tests[2]))
# run the test suite
unittest.TextTestRunner().run(suite)
```
在上面的例子中,我们创建了一个 `TestSuite` 对象,并将测试用例 `MyTestCase1`、`MyTestCase2` 和 `MyTestCase3` 按照预期的顺序添加到 `TestSuite` 中。然后,我们使用 `_tests` 属性访问 `TestSuite` 中的测试用例,并在它们上面添加装饰器,以便它们以预期的顺序执行。
请注意,这种方法需要对 `unittest` 模块的内部实现有一定的了解,并且可能不太容易维护。因此,你应该仔细考虑是否真的需要这样做。
阅读全文