python – unittest无法发现/运行测试

前端之家收集整理的这篇文章主要介绍了python – unittest无法发现/运行测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
some related个问题,但都不适用.

这是我的目录树:

  1. » tree abc_backend
  2. abc_backend/
  3. ├── backend_main.py
  4. ├── FundDatabase.db
  5. ├── healthcheck.py
  6. ├── __init__.py
  7. ├── init.py
  8. ├── portfolio.py
  9. ├── private.py
  10. ├── __pycache__
  11. ├── questionnaire.py
  12. ├── recurring.py
  13. ├── registration.py
  14. ├── tests
  15. ├── config.py
  16. ├── __init__.py
  17. ├── __pycache__
  18. ├── test_backend.py
  19. ├── test_healthcheck.py
  20. └── test_private.py
  21. ├── trading.py
  22. ├── Users.db
  23. ├── VERSION
  24. └── visualisation.py

unittest无法找到任何东西:

  1. top » python -m unittest abc_backend
  2.  
  3. ----------------------------------------------------------------------
  4. Ran 0 tests in 0.000s
  5.  
  6. OK

甚至不在abc_backend中:

  1. abc_backend » python -m unittest tests
  2.  
  3. ----------------------------------------------------------------------
  4. Ran 0 tests in 0.000s
  5.  
  6. OK

我已经验证的内容

>我的测试方法正确命名(test_whatever)@H_301_17@>我的测试用例扩展了unittest.TestCase@H_301_17@> abc_backend和abc_backend / tests目录有一个(空)__ init__.py@H_301_17@>所有测试模块都是可导入的(见下文)@H_301_17@> unittest discover发现测试,但是相对导入存在问题(见下文)@H_301_17@>鼻子能够发现和运行测试,没有问题

我想了解:

>为什么我需要将发现传递给unittest以强制它发现测试?如果没有discover子命令,unittest会做什么? (我认为unittest默认测试发现).根据documentation

python -m unittest is the equivalent of python -m unittest discover

>一旦发现测试(通过强制发现子命令),为什么我有导入问题?

测试模块是可导入的

  1. » python
  2. Python 3.4.3 (default,Oct 14 2015,20:28:29)
  3. [GCC 4.8.4] on linux
  4. Type "help","copyright","credits" or "license" for more information.
  5. >>> import abc_backend.tests
  6. >>> import abc_backend.tests.test_private
  7. >>> import abc_backend.tests.test_healthcheck
  8. >>> import abc_backend.tests.test_backend

unittest discover有相对进口的问题

如果我从顶部目录运行它:

  1. top » python -m unittest discover abc_backend
  2. ======================================================================
  3. ERROR: tests.test_private (unittest.loader.ModuleImportFailure)
  4. ----------------------------------------------------------------------
  5. Traceback (most recent call last):
  6. File "/usr/lib/python3.4/unittest/case.py",line 58,in testPartExecutor
  7. yield
  8. File "/usr/lib/python3.4/unittest/case.py",line 577,in run
  9. testMethod()
  10. File "/usr/lib/python3.4/unittest/loader.py",line 32,in testFailure
  11. raise exception
  12. ImportError: Failed to import test module: tests.test_private
  13. Traceback (most recent call last):
  14. File "/usr/lib/python3.4/unittest/loader.py",line 312,in _find_tests
  15. module = self._get_module_from_name(name)
  16. File "/usr/lib/python3.4/unittest/loader.py",line 290,in _get_module_from_name
  17. __import__(name)
  18. File "/foo/bar/abc_backend/tests/test_private.py",line 6,in <module>
  19. from .. import init
  20. ValueError: attempted relative import beyond top-level package

如果我从abc_backend中运行它:

  1. abc_backend » python -m unittest discover tests
  2.  
  3. ======================================================================
  4. ERROR: test_private (unittest.loader.ModuleImportFailure)
  5. ----------------------------------------------------------------------
  6. Traceback (most recent call last):
  7. File "/usr/lib/python3.4/unittest/case.py",in testFailure
  8. raise exception
  9. ImportError: Failed to import test module: test_private
  10. Traceback (most recent call last):
  11. File "/usr/lib/python3.4/unittest/loader.py",in <module>
  12. from .. import init
  13. SystemError: Parent module '' not loaded,cannot perform relative import

解决方法

我重现了CPython 3.5的所有问题,所以我的回答应该是 @H_301_17@与3.4和3.5相关.

相对进口问题

相对进口存在问题的原因是由于@H_301_17@调用的细节你真的不导入abc_backend包.

首先,我们来看看

  1. top» python3 -m unittest discover abc_backend

当你从那个顶部运行测试时,abc_backend就不会被导入.@H_301_17@这是因为/ home / user / top / abc_backend被添加到sys.path中@H_301_17@of / home / user / top.要解决这个问题,请

  1. top» python3 -m unittest discover abc_backend -t .

现在,关于in-abc_backend调用.当你这样做

  1. abc_backend» python3 -m unittest discover tests

abc_backend不可导入,如/ home / user / top / abc_backend / tests@H_301_17@dir不包含abc_backend包.这也可以解决

  1. abc_backend» python3 -m unittest discover tests -t ../

这将正确地将/ home / user / top dir(双关语)放入sys.path.

-t(或–top-level-directory)选项设置顶级目录@H_301_17@项目和默认启动目录(默认为.).@H_301_17@所以,sys.path中的内容很重要,因为它会影响导入@H_301_17@影响测试加载,因为发现使用导入机器加载测试.

-m unittest和-m unittest发现之间的差异

当你这样做

  1. top» python3 -m unittest abc_backend

实际上你正在运行unittest / __ main__.py文件.那里@H_301_17@调用main(module = None),最终你会得到@H_301_17@loadTestsFromModule这样做

  1. tests = []
  2. for name in dir(module):
  3. obj = getattr(module,name)
  4. if isinstance(obj,type) and issubclass(obj,case.TestCase):
  5. tests.append(self.loadTestsFromTestCase(obj))

由于abc_backend / __ init__.py不包含任何测试用例,@H_301_17@isinstance(obj,type)和issubclass(obj,case.TestCase)返回@H_301_17@所有模块成员都为假(因此测试为空).

要使这种特殊的调用方式发挥作用,您必须这样做@H_301_17@人们通常在发现前的时间做了什么(除了非stdlib@H_301_17@框架):从测试模块手动导入案例(或@H_301_17@也许根据load_tests协议构建测试套件.

又怎样

  1. top» python3 -m unittest discover abc_backend

不同?

基本上,差异可以表示为以下条件:

  1. if len(argv) > 1 and argv[1].lower() == 'discover':
  2. # -m unittest discover
  3. loader.discover(...)
  4. else:
  5. # -m unittest
  6. loader.loadTestsFromNames(...)

当argv是[‘python3 -m unittest’,’discover’,’abc_backend’]时,使用实际发现机制.当argv是[‘python3 -m unittest’,使用loadTestsFromNames,它在某个时刻调用loadTestsFromModule,并且没有找到任何测试.这就是unittest / main.py中的方式.

猜你在找的Python相关文章