【问题标题】:How to Run and Debug unittest in Spyder IDE如何在 Spyder IDE 中运行和调试单元测试
【发布时间】:2017-04-28 00:03:21
【问题描述】:

我有一个名为 AllTests.py 的 python 文件,如下所示:

import unittest
from SomeWonderfulTest import SomeWonderfulTestCase

def runAllTestsNow():
    theTestSuite = unittest.TestSuite()
    theTestSuite.addTest(unittest.makeSuite(SomeWonderfulTestCase)
    return theTestSuite

if __name__ == "__main__":
    unittest.main(defaultTest='runAllTestsNow')

我可以在命令行中运行它,如下所示:

python -m unittest AllTests

但是,我想使用 Spyder IDE 来调试一些问题。我知道在 Spyder 中指定命令行选项,我可以去运行->常规设置->命令行选项。但是,当我尝试将“-m unittest”放入这些选项时,我收到一条错误消息,提示“无法识别选项 -m”。它似乎试图将参数发送到 AllTests.py 文件而不是 python。

如何设置 Spyder 来调试这些单元测试?

【问题讨论】:

  • 如果您只是将测试文件作为常规文件运行,即使用 F5 会发生什么?

标签: python unit-testing debugging spyder


【解决方案1】:

您可以使用模块 spyder-ide/spyder-unittest。

https://github.com/spyder-ide/spyder-unittest

要安装它,请使用:

sudo pip install spyder-unittest

然后重新启动计算机。打开蜘蛛。在右上角,您会发现一个新选项卡:单元测试。点击它。您将看到一个带有 Run test 标签的绿色箭头。这是您将用于运行测试的按钮。

当您第一次单击箭头时,会弹出一个窗口。您可以通过单击设置齿轮(此面板的左上角)-> 配置来访问此弹出窗口。

选择测试框架。我假设你已经安装了unitest。你应该把它作为一个选项。其他选项是py.testnose

选择您的脚本test_<name>.py 所在的文件夹。最佳实践表明,您应该在要测试的脚本所在的文件夹内创建一个名为 unittests 的文件夹:

my_python_scripts_folder/
            -> unittests/
                  test_<name1>.py
                  test_<name2>.py
                  test_<name3>.py
            <name1>.py
            <name2>.py
            <name3>.py

注意名称约定,所有包含测试的脚本都应该有一个以tests_ 开头的名称。您的脚本 test_.py 应如下所示:

import unittest
import sys
sys.path.append("../")   # this adds the mother folder  
                         # "my_python_scripts_folder/" to the python path 
                         # It will allow you to import your modules.
                         # Adjust depending where your tests scripts location

from <name1> import Stuff

class TestClass(unittest.TestCase):
    def test_ImportFromFile(self):
        <do stuff with your Stuff>
        self.assertIsNone(Stuff)
        self.assert  ... etc.

所有测试方法的名称都应以test_ 开头。

查看:https://docs.python-guide.org/writing/tests/ 了解更多信息。

您可以使用 spyde IDE 中的调试工具调试您的测试脚本

【讨论】:

  • You can debug your tests scripts using the debug tools in spyde's IDE - 啊,但这就是诀窍,你是怎么做到的?似乎没有任何 UI 选项。
【解决方案2】:

这篇文章有点老了,但我一直在使用以下(https://stackoverflow.com/users/9450152/%e3%82%ae%e3%83%a7%e3%83%bc%e3%83%a0发布):

在 iPython 控制台中:

!python -m unittest AllTests

开头的感叹号让您可以直接访问 shell。

我发现你真正需要的是:

!python -m unittests

这将从当前工作目录中发现所有模式为“test*.py”的测试文件。当前工作目录显示在工具栏中,或者您可以在 ipython 控制台中键入以下内容:

%pwd

有时我会运行一个测试文件(按 F5 或单击运行箭头)。这会将工作目录更改为该文件所在的位置。然后上面的命令将只搜索从该目录开始的测试文件(顺便说一句,我浪费了很多时间试图弄清楚这一点)。您可以从工具栏更改工作目录(单击向上箭头)或使用:

%cd ..

在控制台中重复,直到到达项目目录。

【讨论】:

    【解决方案3】:

    在 iPython 控制台中:

    !python -m unittest AllTests
    

    开头的感叹号让您可以直接访问 shell。

    【讨论】:

      【解决方案4】:

      显然,要么你不能,要么它坏了,因为 spyder-ide repo 中有 an open issue 与此相关,就像今天 2020 年 1 月 9 日一样。

      我正在使用spyder-unittest,作为解决方法,我会使用调试直接从测试文件调用测试函数。 所以例如在spyder-unittest 的情况下,如果 test_file.py 包含以下测试函数

      def test_something():
        assert(True)
      

      然后在这个函数之后直接调用这个测试函数,例如

      def test_something():
        assert(True)
      
      test_something() 
      

      并在其上放置一个断点。现在不要将您的测试文件作为单元测试运行,只需点击 Debug,这将使您的测试文件在调试模式下像普通文件一样运行,这将让您进入您的测试功能,然后进入带有所有测试数据设置的实际功能。

      注意:这种方法适用于简单的自包含测试用例,但如果你有一个复杂的测试设置,那么它可能不起作用,但你仍然可以对如何制作有一些直觉在你的情况下这项工作。

      【讨论】:

        【解决方案5】:

        该功能目前在 Spyder 及其单元测试插件中不可用。该项目的 bugtracker 中有一张票在大约一年后请求它,但没有明显的进展:https://github.com/spyder-ide/spyder-unittest/issues/126

        作为一种解决方法,您可以使用以下脚本:

        # Entry point for pytest
        #
        # This allows debugging of pytest unit tests in Spyder (or command line).
        # In Spyder, set your breakpoints as required, then run this script
        # (no need to debug, run is enough).
        # The debugger will break automatically on the pytest.main().
        # Continue the execution to jump to your own breakpoints.
        
        import pdb
        pdb.set_trace()
        pytest.main()
        

        保存它,例如“main_pytest.py”,然后在 Spyder 中运行它。不需要调试。调试器将在 pytest.main() 上自动中断。继续执行跳转到你自己的断点。

        它使用标准的 Python 调试器来强制调试。有关文档,请参见此处:https://docs.python.org/3/library/pdb.html

        这种方法的优点是不需要修改实际代码。

        作为奖励,您可以使用文档 (https://docs.pytest.org/en/latest/usage.html) 中所有可能的选项作为 pytest.main() 的参数。

        【讨论】:

          【解决方案6】:

          要在 spyder IDE 中运行单元测试和代码覆盖率,

          !python -m unittest programname.py
          
          !coverage run -m unittest programname.py
          
          !coverage report -m
          
          !coverage html 
          

          查看覆盖率 html:

          1. 打开保存特定测试程序的文件夹
          2. 打开一个名为“htmlcov”的文件夹
          3. 打开“索引”文件。

          【讨论】:

            【解决方案7】:

            所以我对 Spyder 还很陌生,因为我们使用 Visual Studio 进行开发,但是原理看起来很相似。

            所以,我们的工作方式如下:

            IDE 是您用来进行开发的界面。 (在你的情况下是 Spyder,或者在我的情况下是 VS。)

            Anaconda 是(我的)读取和执行 python 的 Python 环境 你写的脚本。这将为您提供解释器窗口等。IDE 使用 Python 环境来运行您的脚本。

            您可以通过几种不同的方式运行测试。

            您创建了一个名为 AllTests.py 的包装类/方法,它是一个 Python 脚本。

            这个 AllTests.py 脚本可以直接在控制台中运行,正如您在问题中所概述的那样。

            您也可以像运行任何其他脚本一样运行 AllTests.py 脚本,如 carlos 所述。

            您还可以在 IDE(Spyder / VS / 等)中安装一个插件,它可以解释所有 UnitTest 类,并以可视方式显示它们,而不是使用命令行。 测试资源管理器(在 VS 中称为)或替代插件将查看您的代码,并找到所有测试,以各种不同的方式将它们组合在一起,允许您按名称/组/等执行它们,并为您提供有关测试及其输出的更多信息。 (执行时间、通过/失败输出等)

            我为 Spyder 找到的一个在这里: https://pypi.python.org/pypi/spyder-unittest

            不知道好不好用,我没用过。这里的其他人可能能够评论它的能力/性能。

            下面是 Visual Studio 测试资源管理器的屏幕截图:

            根据您的要求和开发实践,此测试插件可能是您更好的选择。

            希望对你有所帮助。

            【讨论】:

            • 对不起,这个答案没有解决这个问题,因为我无法从你对 VS 的解释中学习如何使用 Spyder IDE。
            猜你喜欢
            • 1970-01-01
            • 2023-03-27
            • 2014-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-22
            • 2012-11-28
            • 1970-01-01
            相关资源
            最近更新 更多