假设我有一个这样的测试套件:
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 关于将 args 传递给的观点
nose.run
确实适用于一些警告。
不起作用的事情:
- 传递一个人想要执行的所有文件(这很奇怪)
- 传递一个人想要执行的所有模块。(这要么什么都不执行,要么执行错误的事情,要么执行太多的事情。有趣的 0、1 或很多的情况,也许?)
- 在目录之前传入模块:目录必须放在第一位,否则你会得到重复的测试。
这种脆弱性是荒谬的,如果你有改进它的想法,我欢迎评论,或者我建立了 一个 github repo,我的实验试图让它发挥作用。
除此之外,以下工作,包括拾取安装到站点包中的多个项目:
#!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