Unittest(4):unittest_用例执行顺序

unittest用例执行顺序

当在一个测试类或多个测试模块下,用例数量较多时,unittest在执行用例 (test_xxx)时,并不是按从上到下的顺序执行,有特定的顺序。

unittest框架默认根据ACSII码的顺序加载测试用例,数字与字母的顺序为: 0~9,A~Z,a~z。

对于类来说,class TestAxx 会优先于class TestBxx被执行。对于方法来说,test_aaa()方法会有优先于test_bbb()被执行。对于测试目录与测试文件来说,unittest同样是按照这个规则来加载测试用例的。

方式一、通过测试用例的方法名称:根据ACSII码的顺序加载测试用例

代码示例:

# 测试用例的执行顺序
# 1,通过测试用例的方法名称:根据ACSII码的顺序加载测试用例
import unittest
class Test_case(unittest.TestCase):

    # 进行初始化和清理工作
    def setUp(self):
        print("我是setUp方法,进行测试前的初始化工作")
    def tearDown(self) -> None:  # 表示该方法没有返回值
        print("我是tearDown方法,执行测试后的清除工作")

    # 测试用例
    def test_bbb(self):  # 判断是否在里面
        name = ["张飞","马怒","李四"]
        self.assertIn("马怒",name)
        print("测试test_bbb执行结束")

    def test_ccc(self):  # 判断4>2
        self.assertGreater(4,2)
        print("测试test_ccc执行结束")

    def test_aaa(self):
        a = True
        self.assertTrue(a)  # 判断是否为真
        print("测试test_aaa执行结束")

if __name__ == '__main__':
    unittest.main()

查看执行结果:

方式二、通过addtest()添加用例的顺序

代码示例:

# 测试用例的执行顺序
# 2,通过addtest()添加用例的顺序
import unittest
class Test_case(unittest.TestCase):
    # 进行初始化和清理工作
    def setUp(self):
        print("我是setUp方法,进行测试前的初始化工作")
    def tearDown(self) -> None:  # 表示该方法没有返回值
        print("我是tearDown方法,执行测试后的清除工作")


    def test_bbb(self):  # 判断是否在里面
        name = ["张飞","马怒","李四"]
        self.assertIn("马怒",name)
        print("测试test_bbb执行结束")

    def test_ccc(self):  # 判断4>2
        self.assertGreater(4,2)
        print("测试test_ccc执行结束")

    def test_aaa(self):
        a=True
        self.assertTrue(a)  # 判断是否为真
        print("测试test_aaa执行结束")


if __name__ == '__main__':
    suite = unittest.TestSuite()  # 测试套件实例
    suite.addTest(Test_case("test_bbb"))  # 类名(方法名称)
    suite.addTest(Test_case("test_aaa"))
    suite.addTest(Test_case("test_ccc"))
    unittest.main(defaultTest="suite")

查看执行结果


### 解决 `unittest.py` 文件导入冲突问题 当使用 pytest 和 unittest 时,可能会遇到文件命名冲突的问题。如,如果项目中存在名为 `unittest.py` 的文件,则可能导致 pytest 无法正确收集测试用,因为 Python 解释器会优先加载当前目录中的 `unittest.py` 文件,而不是标准库中的 `unittest` 模块[^1]。 #### 确保 pytest 正确收集测试用的解决方案 为了防止此类冲突,应避免在项目中创建与标准库模块同名的文件。以下是解决方法: #### 1. 更改自定义文件名 将项目中的 `unittest.py` 文件重命名为其他名称,如 `test_unittest.py` 或 `custom_unittest.py`。这可以避免与标准库模块冲突[^1]。 ```python # 原始文件名:unittest.py # 修改后的文件名:test_unittest.py ``` #### 2. 删除生成的 `.pyc` 文件 在修改文件名后,确保删除项目目录下的所有 `.pyc` 文件和 `__pycache__` 文件夹,以防止加载旧的缓存文件[^1]。 ```bash find . -name "*.pyc" -exec rm -f {} + find . -name "__pycache__" -exec rm -rf {} + ``` #### 3. 验证模块导入路径 在代码中验证是否正确导入了标准库中的 `unittest` 模块。可以通过以下代码检查导入路径: ```python import unittest print(unittest.__file__) ``` 如果输出显示的是项目目录中的路径,则说明仍存在冲突。需要重新检查文件命名和缓存清理步骤[^1]。 #### 4. 使用 pytest 的 `-p no:unittest` 选项 如果必须保留 `unittest.py` 文件名,可以在运行 pytest 时使用 `-p no:unittest` 选项禁用 pytest 自动加载 unittest 插件。这可以避免插件与自定义文件之间的冲突[^2]。 ```bash pytest -p no:unittest ``` #### 5. 确保测试用符合 pytest 的命名规范 pytest 会自动扫描当前目录及其子目录下所有名为 `test_*.py` 或 `*_test.py` 的文件,并执行其中以 `test_` 开头的函数。因此,确保测试文件和函数遵循这些命名规则[^3]。 以下是一个符合 pytest 规范的测试示: ```python # test_example.py def test_upper(): assert 'foo'.upper() == 'FOO' ``` #### 6. 配置 pytest 的 `conftest.py` 如果需要进一步定制 pytest 的行为,可以在项目根目录下创建 `conftest.py` 文件,并添加自定义配置。如,指定测试文件的搜索路径或排除特定文件[^4]。 ```python # conftest.py def pytest_collection_modifyitems(config, items): for item in items: if "unittest.py" in str(item.fspath): item.add_marker(pytest.mark.skip(reason="Avoid conflict with standard library")) ``` --- ### 示代码:完整的测试结构 以下是一个完整的测试项目结构示,展示如何避免文件冲突并正确运行 pytest: ```plaintext project/ │ ├── test_unittest.py ├── conftest.py └── README.md ``` #### `test_unittest.py` 内容 ```python import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_split(): assert 'hello world'.split() == ['hello', 'world'] ``` #### 运行测试 ```bash pytest ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值