【问题标题】:Unittest in Python 2 not working in Python 3Python 2 中的单元测试在 Python 3 中不起作用
【发布时间】:2018-03-09 10:37:19
【问题描述】:

为了练习和提高我的编程技能,我决定用 Python 构建一个应用程序来解决 Project Euler 中的问题。我没有单元测试经验,所以我决定在 TDD 的帮助下构建我的项目并获得一些经验。不幸的是,在构建基础时,我使用 Python3 运行我的程序,但使用 Python2 进行了所有单元测试。现在我尝试使用 Python3 进行测试,但失败了。

在此之前,我只用 Python 编写过一些小脚本。我希望这个项目更大,而且它会包含更多文件,所以经过一些研究,我决定使用以下项目结构:

project_euler:
  euler:
    - __init__.py
    - euler.py
    - problems.py
  tests:
    - __init__.py
    - test_euler.py
    - test_problems.py

初始化文件是空的。

euler.py

#!/usr/bin/env python3
# coding: utf-8


class Euler:
    def __init__(self):
        pass

problems.py

#!/usr/bin/env python3
# coding: utf-8

import sys
import euler


class ProjectEuler(euler.Euler):
    def __init__(self):
        pass

test_euler.py

#!/usr/bin/env python3
# coding: utf-8

import unittest
import euler.euler as euler


class UnitTest(unittest.TestCase):
    # a bunch of tests here

if __name__ == '__main__':
    unittest.main(module=None)

test_problems.py

#!/usr/bin/env python3
# coding: utf-8

import unittest
from euler import problems


class UnitTest(unittest.TestCase):
    # a bunch of tests here

if __name__ == '__main__':
    unittest.main(module=None)

以下命令确实有效:
python -m unittest 发现
python -m unittest tests.test_problems

以下没有。
python3 -m unittest discover

ImportError: Failed to import test module: tests.test_problems
Traceback (most recent call last):
  File "/usr/lib64/python3.6/unittest/loader.py", line 428, in _find_test_path
    module = self._get_module_from_name(name)
  File "/usr/lib64/python3.6/unittest/loader.py", line 369, in _get_module_from_name
    __import__(name)
  File "/home/me/code/project_euler/tests/test_problems.py", line 5, in <module>
    import euler.problems as problems
  File "/home/me/code/project_euler/euler/problems.py", line 8, in <module>
    class ProjectEuler(euler.Euler):
AttributeError: module 'euler' has no attribute 'Euler'

python3 -m unittest tests.test_problems

Traceback (most recent call last):
  File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib64/python3.6/unittest/__main__.py", line 18, in <module>
    main(module=None)
  File "/usr/lib64/python3.6/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib64/python3.6/unittest/main.py", line 141, in parseArgs
    self.createTests()
  File "/usr/lib64/python3.6/unittest/main.py", line 148, in createTests
    self.module)
  File "/usr/lib64/python3.6/unittest/loader.py", line 219, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib64/python3.6/unittest/loader.py", line 219, in <listcomp>
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib64/python3.6/unittest/loader.py", line 153, in loadTestsFromName
    module = __import__(module_name)
  File "/home/me/code/project_euler/tests/test_problems.py", line 5, in <module>
    import euler.problems as problems
  File "/home/mvrakking/code/project_euler/euler/problems.py", line 8, in <module>
    class ProjectEuler(euler.Euler):
AttributeError: module 'euler' has no attribute 'Euler'

我尝试了各种选项,但它破坏了我的程序或单元测试。我找不到导致此问题的 Python 2.7.13 和 3.6.2 之间的区别。

【问题讨论】:

    标签: python python-2.7 python-3.x tdd python-unittest


    【解决方案1】:

    问题存在于文件 problems.py 中的行 import euler。尝试在from .euler import Euler上替换它

    【讨论】:

    • 当我运行程序时会给出以下消息: ModuleNotFoundError: No module named 'main.euler'; 'main' 不是包
    • 尝试在main中添加__init__
    • 无论如何,问题出在这一行,这取决于结构和设置
    • 我没有主文件。我也在这一行尝试了几件事,但它破坏了程序或单元测试。
    • 你使用一些 IDE 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2020-09-24
    • 2019-11-26
    • 2021-03-23
    相关资源
    最近更新 更多