gpt4 book ai didi

python - 在 nose 或 pytest 中收集以编程方式生成的测试套件的好方法

转载 作者:太空狗 更新时间:2023-10-29 20:27:33 26 4
gpt4 key购买 nike

假设我有一个这样的测试套件:

class SafeTests(unittest.TestCase):
# snip 20 test functions

class BombTests(unittest.TestCase):
# snip 10 different test cases

我目前正在做以下事情:

suite = unittest.TestSuite()
loader = unittest.TestLoader()
safetests = loader.loadTestsFromTestCase(SafeTests)
suite.addTests(safetests)

if TARGET != 'prod':
unsafetests = loader.loadTestsFromTestCase(BombTests)
suite.addTests(unsafetests)


unittest.TextTestRunner().run(suite)

我有一个主要问题,还有一个有趣的地方

  • 我想使用 nose 或 py.test(哪个并不重要)
  • 我有大量不同的应用程序正在公开这些测试通过入口点的套房。

    我希望能够在所有已安装的系统中汇总这些自定义测试应用程序,因此我不能只是使用巧妙的命名约定。我不特别关心通过入口点暴露的这些,但我确实关心能够跨应用程序运行测试站点包。 (不只是导入...每个模块。)

关心维护当前对unittest.TestCase,消除这种依赖实际上是一个目标。


编辑 这是为了确认@Oleksiy 关于将参数传递给nose.run 实际上确实在一些警告下起作用。

的东西:

  • 传递一个人想要执行的所有文件(这,很奇怪)
  • 传递一个人想要执行的所有模块。 (这要么执行什么都没有,错误的事情,或者太多的事情。 0、1 或的有趣情况很多,也许?)
  • 在目录之前传递模块:目录必须来首先,否则你会得到重复的测试。

这种脆弱性是荒谬的,如果你有改进它的想法,我欢迎评论,或者我设置 a github repo with myexperiments trying to get this to work .

除此之外,以下工作,包括选择多个项目安装到站点包中:

#!python
import importlib, os, sys
import nose

def runtests():
modnames = []
dirs = set()
for modname in sys.argv[1:]:
modnames.append(modname)

mod = importlib.import_module(modname)
fname = mod.__file__
dirs.add(os.path.dirname(fname))

modnames = list(dirs) + modnames

nose.run(argv=modnames)

if __name__ == '__main__':
runtests()

如果将其保存到 runtests.py 文件中,则在运行时会做正确的事情:

runtests.py project.tests otherproject.tests

最佳答案

对于 Nose ,您可以同时进行两个测试,然后使用 attribute 选择要运行的测试。插件,非常适合选择要运行的测试。我会保留这两个测试并为它们分配属性:

from nose.plugins.attrib import attr

@attr("safe")
class SafeTests(unittest.TestCase):
# snip 20 test functions

class BombTests(unittest.TestCase):
# snip 10 different test cases

对于您的生产代码,我会用 nosetests -a safe 调用 nose,或者在您的操作系统生产测试环境中设置 NOSE_ATTR=safe,或者在 nose 上调用运行方法对象根据您的 TARGET 使用 -a 命令行选项在 python 中本地运行它:

import sys
import nose

if __name__ == '__main__':
module_name = sys.modules[__name__].__file__
argv = [sys.argv[0], module_name]
if TARGET == 'prod':
argv.append('-a slow')

result = nose.run(argv=argv)

最后,如果由于某种原因您的测试未被发现,您可以使用 @istest 属性(from nose.tools import istest)将它们明确标记为测试

关于python - 在 nose 或 pytest 中收集以编程方式生成的测试套件的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19523260/

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