debugging 如何在Spyder IDE中运行和调试单元测试

unhi4e5o  于 2022-11-14  发布在  其他
关注(0)|答案(7)|浏览(192)

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

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以调试这些单元测试?

sirbozc5

sirbozc51#

您可以使用模块spyder-ide/spyder-unittest。
https://github.com/spyder-ide/spyder-unittest
要安装它,请用途:

sudo pip install spyder-unittest

然后重新启动你的电脑。打开Spyder。在右上角你会发现一个新的标签:公寓测试.单击它.您将看到一个带有标签运行测试得绿色箭头.这是您将用于运行测试得按钮.

当您第一次点击箭头时,会弹出一个窗口。您可以通过点击设置齿轮(此面板的左上角)-〉配置来访问此弹出窗口。
选择测试框架。我假设你已经安装了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中的调试工具调试测试脚本

5lhxktic

5lhxktic2#

这篇文章有点老了,但我一直在使用以下内容(由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键或单击Run箭头)。这会将工作目录更改为该文件所在的目录。然后上面的命令将只从该目录开始搜索测试文件(顺便说一句,我浪费了很多时间来尝试找出这个问题)。您可以从工具栏更改工作目录(单击向上箭头)或用途:

%cd ..

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

r7xajy2e

r7xajy2e3#

在iPython控制台中:

!python -m unittest AllTests

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

pnwntuvh

pnwntuvh4#

目前Spyder和它的单元测试插件中还没有这个功能。项目的bug跟踪器中有一张票要求使用这个功能,大约一年了,没有明显的进展: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()的参数。

zbq4xfa0

zbq4xfa05#

显然,要么你不能,要么它是坏的,因为有an open issue在spyder-ide回购关于这一点,因为它站在今天2020年1月9日。
我正在使用spyder-unittest,作为变通方法,我将使用debug. so直接从测试文件调用测试函数,例如,在spyder-unittest的情况下,如果test_file.py包含以下测试函数

def test_something():
  assert(True)

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

def test_something():
  assert(True)

test_something()

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

**注意:**这种方法在简单的自包含测试用例中有效,但是如果您有一个复杂的测试设置,那么它可能不起作用,但是您仍然可以获得一些关于如何在您的用例中使其工作的直觉。

dced5bon

dced5bon6#

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

!python -m unittest programname.py

!coverage run -m unittest programname.py

!coverage report -m

!coverage html

要查看服务范围html,请执行以下操作:
1.打开保存特定测试程序的文件夹
1.打开名为“htmlcov”文件夹
1.打开“索引”文件。

n9vozmp4

n9vozmp47#

因此,我对Spyder相当陌生,因为我们正在使用Visual Studio进行开发,但原理似乎相似。
因此,我们的工作原理如下:
IDE是您用来进行开发的接口(在您的情况下是Spyder,在我的情况下是VS)。
Anaconda是(我的)Python环境,它读取并执行您编写的Python脚本。这将为您提供解释器窗口等。IDE使用Python环境来运行脚本。
您可以用几种不同的方式运行测试。
您已经创建了一个名为www.example.com的 Package 类/方法AllTests.py,它是一个python脚本。
这个AllTests.py脚本可以直接在控制台中运行,如您在问题中所述。
您还可以AllTests.py像运行任何其他脚本一样运行www.example.com脚本,如卡洛斯所述。
您还可以将插件安装到IDE中(Spyder / VS / etc),它解释所有UnitTest类,并以可视化的方式显示它们,而不是使用命令行。(在VS中是这样称呼的),或者替代的插件会浏览你的代码,找到你所有的测试,以各种不同的方式将它们分组在一起,允许你按名称/组/等来执行它们,并为您提供有关测试及其输出的进一步信息。(执行时间、通过/失败输出等)
我为Spyder找到的一个示例如下:https://pypi.python.org/pypi/spyder-unittest
不知道它是否好,因为我没有用过它。这里的其他人可能可以评论它的能力/性能。
下面是Visual Studio测试资源管理器的屏幕截图:

根据您的需求和开发实践,此测试插件可能是您的更佳选择。
我希望这对你有帮助。

相关问题