在PyCharm中运行Python包的单元测试

6
我刚刚将我正在编写的Python包移植到PyCharm上,但在IDE中运行整个包的单元测试时遇到了一些问题。
在包的__init__.py文件中,我有一个load_tests函数,它遍历包中的所有模块并加载相关测试。以下命令可以完美运行该函数:
$python -m unittest my_package

然而,当我尝试从PyCharm运行它时(通过在项目窗口中选择顶级目录并按下Ctrl+Shift+F10),我在运行窗口中得到了No tests were found的提示。

...\python.exe ...\pycharm\utrunner.py .../my_package/ true
Testing started at ...
Process finished with exit code 0
Empty test suite.

在控制台窗口中。
我快速查看了PyCharm的utrunner.py,并且它似乎正在寻找某些模块(以test开头)。我想保留当前的基本方法。如何在尽可能少地修改代码的情况下,配置PyCharm使用__init__.py中的load_tests?
顺便说一句,个别模块的测试套件在PyCharm中运行得很好。
使用PyCharm 3.1 Community Edition,Python 2.7。
2个回答

5

考虑到PyCharm 3.4,本答案已经编写完毕。

我曾遇到同样的问题,并在此答案中找到了解决方案,希望我理解了你的问题:

https://dev59.com/JWgv5IYBdhLWcg3wD8uY#12242021

我像这样配置了我的Python测试运行器配置:

  • 勾选'All in Folder'
  • 模式是正则表达式“.*_Test.py”(不带引号)
  • 勾选“仅检查unittest.TestCase的子类”。

现在它可以在名为classToBeTested_Test.py的子文件夹中找到我的单元测试了。

顺便说一下,我现在面临另一个问题:单元测试无法导入要测试的模块。我认为这是由于不同的根文件夹引起的。


您可以在“设置 > 项目结构 > 添加内容根目录”中添加不同的根文件夹。 - simonzack
1
只是提醒一下其他人...我花了一点时间才发现,“pattern”使用的是正则表达式,而不是像*Test.py那样的常规shell glob。如果使用类似的东西,测试运行程序将会崩溃。我直到查看堆栈跟踪才意识到它需要一个正则表达式! - Andrew
2
只是为了完整起见,对于那些可能不太了解正则表达式的人来说,单个星号(*)不会递归搜索,请使用两个星号进行递归搜索。例如:**_test.py - Memophysic
@Memophysic 至少对我来说,这是正则表达式中的非法语法(多次重复没有先前的模式)。看起来像是通配符。 - villasv
@VillasV 的确是这样,但它在 PyCharm 中可以运行。然而我不知道 JetBrain 的开发人员是如何实现它的。毕竟,PyCharm 是用 Java 编写的。无论如何,“**” 现在已经非常常见了,甚至 glob 在 3.5 版本以上也支持使用它。 - Memophysic

2

使用 PyCharm 2016.2:

  • 测试:脚本
  • 脚本/path/to/tests/__init__.py
  • 勾选 仅检查 unittest.TestCase 的子类。这会导致 utrunner 使用 unittest.TestLoader.loadTestsFromModule() 并调用模块中的 load_tests() 方法(如果存在)。

即命令为

python C:\python\pycharm\helpers\pycharm\utrunner.py /path/to/tests/__init__.py true

我还必须从 __init__.py 中的 sys.path 中删除 tests 目录(参见 PY-15889):

basedir = os.path.dirname(__file__)
try:
    sys.path.remove(basedir)
except ValueError:
    pass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接