当前位置: 首页 > 知识库问答 >
问题:

如何运行unittest发现从"pythonsetup.py测试"?

杜诚
2023-03-14

我试图找出如何让Pythonsetup.py测试运行等效的Python-m unittest发现。我不想使用run_tests.py脚本,也不想使用任何外部测试工具(如nospy.test)。如果该解决方案仅适用于python 2.7,则可以。

设置中。py,我想我需要在config中的test\u套件和/或test\u loader字段中添加一些内容,但我似乎找不到一个正确工作的组合:

config = {
    'name': name,
    'version': version,
    'url': url,
    'test_suite': '???',
    'test_loader': '???',
}

这是否可能只使用Python 2.7中内置的unittest

仅供参考,我的项目结构是这样的:

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- I want to delete this
  setup.py

更新:这可以通过unittest2实现,但我只想通过unittest

从…起https://pypi.python.org/pypi/unittest2

unittest2包括一个非常基本的setupols兼容测试收集器。在setup.py.中指定test_suite='unittest2.collector'这将使用包含setup.py的目录中的默认参数启动测试发现,因此作为示例可能最有用(请参阅unittest2/collector.py)...

现在,我只是使用一个名为run_tests.py的脚本,但是我希望我可以通过移动到一个只使用pythonsetup.pytest的解决方案来摆脱这个问题。

下面是运行测试。py我希望删除:

import unittest

if __name__ == '__main__':

    # use the default shared TestLoader instance
    test_loader = unittest.defaultTestLoader

    # use the basic test runner that outputs to sys.stderr
    test_runner = unittest.TextTestRunner()

    # automatically discover all tests in the current dir of the form test*.py
    # NOTE: only works for python 2.7 and later
    test_suite = test_loader.discover('.')

    # run the test suite
    test_runner.run(test_suite)

共有3个答案

臧梓
2023-03-14

你不需要配置就能让它工作。基本上有两种主要方法:

快速的方法

重命名测试模块。py模块测试。py(基本上是将\u test作为后缀添加到特定模块的测试中),python将自动找到它。只需确保将其添加到设置中即可。py

from setuptools import setup, find_packages

setup(
    ...
    test_suite = 'tests',
    ...
)

长途跋涉

以下是如何使用当前目录结构执行此操作:

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- I want to delete this
  setup.py

tests/\uuuu init\uuu下。py,您希望导入unittest和单元测试脚本test\u模块,然后创建一个函数来运行测试。在tests/\uuuuu init\uuuuu中。py,键入如下内容:

import unittest
import test_module

def my_module_suite():
    loader = unittest.TestLoader()
    suite = loader.loadTestsFromModule(test_module)
    return suite

TestLoader类除了loadestsfrommodule之外还有其他功能。您可以运行dir(unittest.TestLoader)来查看其他的,但这是最简单的用法。

由于目录结构是这样的,您可能希望test\u模块能够导入模块脚本。您可能已经这样做了,但为了以防万一,您可以包含父路径,以便导入模块和模块脚本。在测试模块的顶部。py,类型:

import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import unittest
import package.module
...

最后,在设置中。py,包括测试模块,并运行您创建的命令,我的模块套件

from setuptools import setup, find_packages

setup(
    ...
    test_suite = 'tests.my_module_suite',
    ...
)

然后运行python安装程序。py测试

这是一个有人做为参考的样本。

施默
2023-03-14

从构建和分发包与Setupols(强调我的):

test_suite

命名unittest的字符串。TestCase子类(或包含其中一个或多个的包或模块,或此类子类的方法),或命名一个可以在没有参数的情况下调用并返回unittest的函数。测试套件。

因此,在设置中。py您将添加一个返回TestSuite的函数:

import unittest
def my_test_suite():
    test_loader = unittest.TestLoader()
    test_suite = test_loader.discover('tests', pattern='test_*.py')
    return test_suite

然后,将命令set指定如下:

setup(
    ...
    test_suite='setup.my_test_suite',
    ...
)
姬俊驰
2023-03-14

如果使用py27或py32,解决方案非常简单:

test_suite="tests",
 类似资料:
  • 许多标准库不使用类名,如何从命令行运行单个测试用例或将其添加到测试套件中? 这里提出了类似的问题,但所有解决方案都假设测试用例驻留在具有有效类名的文件中。 从unittest运行单个测试。通过命令行测试用例

  • 问题内容: 我刚刚开始学习TDD,并且正在使用Tkinter GUI开发程序。唯一的问题是,一旦调用该方法,测试套件就会挂起,直到关闭窗口。 这是我的代码的示例: 测试Tkinter应用程序的合适方法是什么?还是只是“不”? 问题答案: 您可以做的一件事是在单独的线程中生成mainloop并使用您的主线程运行实际的测试;照看mainloop线程。进行断言之前,请确保检查Tk窗口的状态。 多线程处理

  • 类似于这个问题。然而,当使用ddt时,公认的解决方案不适用于我。 例如: 如果我在终端上运行这个,它就不起作用了

  • 问题内容: 我希望每晚和每次提交svn时都为C#应用程序运行自动化的NUnit测试。 Jenkins-CI可以做到这一点吗? 是否有在线教程或操作指南文档,其中记录了我可以查看的类似设置? 问题答案: 我需要做的正是您要做的,这是我设置Jenkins的方法: 将NUnit插件添加到Jenkins 在您的项目中,转到 配置 -> 构建 -> 添加构建步骤 在下拉菜单中,向下滚动至-> 执行Windo

  • 设置中有两个选项。py和让我很困惑。根据这个网站,使用创建一个指向站点包目录的特殊链接。 人们建议我使用进行新的安装,并且在安装文件进行任何更改后,。 有人能解释一下这些命令的用法吗?

  • 我在mvn中有以下结构。 模块A是所有后续模块(B、C、...)继承的模块。该模块具有通用功能和jUnit/联调用例。它不是Web应用程序。 模块B是一个web应用程序。它依赖于模块B。 模块C是一个web应用程序。它依赖于模块B。 我们的Jersey rest/api代码位于模块A中。通过这种方式,无论我们部署什么模块,我们都可以访问rest/api。 到目前为止,我已经成功地在模块C中配置了M