如何使Pycharm从tests文件夹递归运行所有Python单元测试

11

我来自Java背景,因此我将我的单元测试组织成一个反映我的主项目结构的分离的并行测试层次结构。我使用PyCharm代替Intellij或Eclipse。在这两个IDE中,我可以选择任何要测试的包并递归地运行该命名空间下的所有unittest。

测试结构

+ tests
    + billing
        +  supplier
            + ClassName_tests.py - file
                - TestClassName  - class
                    - test_one() - functions
                    - test_two() - functions
    + config
        ...
    + invoicing
        ...

使用Python和/或PyCharm可以实现这个功能吗?目前,我需要分别在每个命名空间/模块中运行测试。我是否需要在PyCharm或Python中定义一些内容。

我已经阅读并尝试了这个设置,但它只会运行所选文件夹中的所有测试,而不是递归地运行。 如何强制Pycharm运行所有单元测试?


你的意思是通过递归方式运行“test”目录中的所有测试吗? - Karl
2
...和以下。递归地遍历目录并迭代整个树中每个目录中的每个测试。 - Martin of Hessle
6个回答

8

因为我曾经卡在这个问题上很久,所以在这里发布一个答案......
其他的答案都绕着这个问题转,但是解决您的情况相对简单:
当Pycharm在一个目录中发现测试时,它会将子目录视为要在其中查找测试的模块。
这意味着如果您想要在这些文件夹中进行发现,则需要包含一个名为__init__.py的文件。
换句话说:

您的示例:

+ tests
    + billing
        +  supplier
            + ClassName_tests.py - file
           
    + ... (omitted the rest for brevity)

Should turn into:

+ tests
    + billing
        - __init__.py
        +  supplier
            - __init__.py
            - ClassName_tests.py - file
           
    + ...

之后,右键单击“tests”目录并运行其中的所有测试应该运行您所有的测试,包括子文件夹中的测试,但仅针对可以被视为模块的子文件夹(例如包含__init__.py文件的子文件夹)。


这应该是被接受的答案。 - Glemi
这只对我在“供应商”级别上起作用。右键单击“账单”或“测试”,我没有运行测试的选项。 :-/ - AudioDroid

3
在PyCharm中,首先设置你的默认测试运行器enter image description here。现在右键点击你的“test”文件夹。应该会出现一个“run py.test”(或类似的,取决于你选择的测试)选项。就这样,不需要更多了。
(编辑:此方法适用于专业版。我无法确认社区版是否可行)

2
这就是我的操作,它只运行所选文件夹中的测试,不会递归遍历目录。实际上,/tests是空的,但包含5个测试目录,每个目录又包含多个子目录。 - Martin of Hessle
1
你的测试文件叫什么?据我所知,PyCharm使用一种相当简单的方法来查找测试。大致上是查找文件/函数名称中包含“test”或“Test”的内容。 - Karl
1
我已经在问题中添加了部分文件夹结构以及示例名称。 - Martin of Hessle
2
尝试将ClassName_tests.py重命名为“test_ClassName.py”。 - Karl

1
这是对我有效的方法:
  1. Make a new shell script inside your parent directory. Say "run_tests.sh".

  2. Write shell code to run tests wherever you want (as YuhaoQI suggested). If you want to run all tests in the project:

    python -m unittest discover -s ./ -p "test_*.py"
    

    or If you want to run all tests in one directory "tests":

    python -m unittest discover -s tests -p "test_*.py"
    
  3. In pycharm configurations dropdown click "Edit Configurations" and add the shell script you just made. Name the configuration "All tests".


2
这也是我正在做的事情,但这并不能为您提供漂亮的测试控制台,在底部您可以看到并最终重新启动失败的测试等。 - KIC

0

真是遗憾PyChorm不支持这个功能,而IntelliJ却支持。所以我使用了一个相当巧妙的解决方法。我创建了一个名为"all_tests"的文件夹,然后将所有模块的测试文件夹都建立了符号链接到这个文件夹中。从这里开始,只需右键点击并运行所有测试即可。

请注意,Windows也支持符号链接,它被称为mklink,但是要同时支持Windows和Linux并不容易。


0
  • 打开设置。
  • 导航到项目设置。
  • 选择项目结构
  • 找到您的顶级test文件夹并选择它。通过在窗口顶部的栏中点击Tests选项,将其标记为Tests

现在,您应该能够通过右键单击来运行测试文件夹中的所有子文件夹中的所有测试。


-3

你可以使用

python -m unittest discover -s project_directory -p "*_test.py"

或者

python -m unittest discover project_directory "*_test.py"

请参考单元测试文档的“测试发现”章节了解详情


在Python控制台中,出现以下错误: File "<input>", line 1 python -m unittest discover -s project_directory -p "*_test.py" ^ SyntaxError: 语法无效 - Martin of Hessle
这些代码应该在终端中执行,并且你需要稍微修改一下。 - YuhaoQI
4
这不是PyCharm的正确答案。你 不应该 在终端中运行测试! - Tom Swirly

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