gpt4 book ai didi

Python:使模块对 TestRunner 可见的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 21:03:03 32 4
gpt4 key购买 nike

在看了几个关于 django 测试的演示后,我想编写自己的 TestRunner 代码以跳过 django 测试,并为我的测试创建更好的包结构。

问题是我们更改了项目结构,测试运行器无法找到正确的路径来进行测试发现。这是我的项目的样子:

project/
-src/
- project_name/
- apps/
- test/ # Not a good name, i know, will change it
- some_app/

- test_models.py
- manage.py
- development.db

现在,为了测试 test_models.py,我想这样做:

$ cd project/src/
$ python manage.py test some_app.test_models

问题是测试运行程序无法找到该包 (some_app) 和模块 (test_models.py)。如果我在测试运行程序中硬编码名称,它会改变,但我不喜欢这样做。这是我为让它发挥作用所做的工作。

test_labels = ["%s.%s" % ("project_name.test", l)
for l in test_labels
if not l.startswith("project_name.test")]

所以,如果你这样做

$ python manage.py test some_app.test_models

它将被重写为:

$ python manage.py test project_name.test.some_app.test_models

而且效果很好。

我尝试执行 sys.path.append("(...)/project_name/test) 但都不起作用。

这是我的 TestRunner 的代码:

class DiscoveryDjangoTestSuiteRunner(DjangoTestSuiteRunner):
"""A test suite runner that uses unittest2 test discovery.
It's better than the default django test runner, becouse it
doesn't run Django tests and let you put your tests in different
packages, modules and classes.

To test everything in there:
$ ./manage.py test

To test a single package/module:

$ ./manage.py test package
$ ./manage.py test package.module

To test a single class:

$ ./manage.py test package.module.ClassName
"""
def build_suite(self, test_labels, extra_tests=None, **kwargs):
suite = None
discovery_root = settings.TEST_DISCOVERY_ROOT
if test_labels:
# This is where I append the path
suite = defaultTestLoader.loadTestsFromNames(test_labels)
# if single named module has no tests, do discovery within it
if not suite.countTestCases() and len(test_labels) == 1:
suite = None
discovery_root = import_module(test_labels[0]).__path__[0]

if suite is None:
suite = defaultTestLoader.discover(
discovery_root,
top_level_dir=settings.BASE_PATH,
)

if extra_tests:
for test in extra_tests:
suite.addTest(test)

return reorder_suite(suite, (TestCase,))

最佳答案

您的 Python 导入层次结构 Root 于 project/src。因此,test_models 模块的正确 Python 导入路径是 project_name.test.some_app.test_models,所以这就是我希望作为测试标签传入的内容。

但是您不喜欢每次要运行特定测试模块时都键入 project_name.test 前缀,因为您的所有测试都将位于此处。没关系:您选择引入一些隐含的非显而易见的行为以换取一些便利。你绝对不应该为了实现这一点而向 sys.path 添加任何东西:Python 导入完整性的关键是让你的给定代码库的导入层次结构 Root 于一个地方,并且恰好是一个地方;重叠的 sys.path 条目会导致类似以不同名称重复导入同一模块的问题。

您真正想要的只是方便的 UI,在我看来,您展示的测试标签修改代码是实现这种便利的明显方式。您不喜欢对 project_name.test 前缀进行硬编码,但它必须在某处进行硬编码:测试运行器无法神奇地发现您想要在测试标签前加上项目名称.测试。如果您希望您的 TestRunner 更通用,您可以将其拉出到类似 BASE_TEST_MODULE 或类似设置的设置中,并将该设置的值添加到每个测试标签。

关于Python:使模块对 TestRunner 可见的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454960/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com