如何用Bazel在Python中运行多个测试文件的测试?
解决Bazel py_test仅执行单个测试文件的问题
可能的原因及对应方案
1. 测试运行命令仅指定单个测试目标
如果运行测试时只输入了bazel test //:test_binary这类指向单个测试目标的命令,自然只会执行该文件的测试。要执行所有测试:
- 运行
bazel test //...:执行当前目录及所有子目录下的全部测试目标 - 若配置了包含所有测试的统一目标(比如
all_tests),运行bazel test //:all_tests
2. 测试文件未被测试框架自动发现
如果使用Python标准库unittest,默认unittest.main()只会扫描当前文件的测试用例,不会自动识别同目录下其他测试文件的内容。可以通过两种方式解决:
- 拆分测试目标:为每个测试文件单独配置
py_test,确保每个测试都能独立执行:py_binary( name = "the_binary", srcs = glob(["*.py"]) - glob(["test_*.py"]), # 排除测试文件,避免主程序打包测试代码 deps = [], ) py_test( name = "test_binary", srcs = ["test_binary.py"], deps = [":the_binary"], # 依赖主程序目标,确保测试能正常导入业务模块 ) py_test( name = "test_two", srcs = ["test_two.py"], deps = [":the_binary"], ) - 改用pytest作为测试运行器:pytest能自动发现符合命名规则的测试文件和用例,配置示例:
注:需要先在WORKSPACE文件中通过py_test( name = "all_tests", srcs = glob(["test_*.py"]), deps = [":the_binary", "@pypi//pytest"], # 引入pytest依赖 args = ["."], # 指定测试扫描目录 main = "pytest", # 用pytest作为测试入口 )pip_install规则配置pytest的依赖。
3. 测试文件编写不符合框架规范
检查test_two.py的测试用例是否符合所选框架的要求:
- 若用
unittest:测试类必须继承unittest.TestCase,测试方法名必须以test_开头import unittest import two class TestTwo(unittest.TestCase): def test_two_core_func(self): self.assertEqual(two.some_core_func(), expected_value) - 若用pytest:测试函数名以
test_开头即可,无需继承类
内容的提问来源于stack exchange,提问作者Ibolit
相关产品推荐
相关产品推荐

