如何运行 test/a.py 形式的单元测试?

2023-11-26

是否可以实现一个具有如下文件结构的Python项目?:

myproj
├── a.py
├── b.py
├── c.py
└── test/
    ├── a.py
    ├── b.py
    └── c.py

Note, in particular, that the test scripts under test/ have the same basenames as the module files they are testing  1. (In other words, test/a.py contains the unit tests for a.py; test/b.py contains those for b.py, etc.)

下的测试test/全部进口unittest并定义子类unittest.TestCase.

我想知道如何运行测试test/,无论是单独的还是一起的。

我尝试过很多变体python -m unittest ...,但它们要么失败(下面的示例),要么最终运行零测试。

例如,

% python -m unittest test.a
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
    main(module=None)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'a'

如果我更改名称test/目录到t/,则错误变为:

% python -m unittest t.a
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
    main(module=None)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
ImportError: No module named t

Or

% python -m unittest t/a.py
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
    main(module=None)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
ImportError: Import by filename is not supported.

(我使用的是Python 2.7.9。)


UPDATE

由于我对这个问题给予了奖励,因此我将非常明确地说明什么是可接受的答案。

以下任何一项都是可以接受的:

  • 如何调用unittest从命令行运行单个测试,或运行所有测试test/目录;解决方案对测试脚本中的代码进行少量更改(例如对导入语句的修改)是可以接受的。

  • 如果由于某种原因无法实现上面显示的文件结构,则详细的解释将是一个可接受的解决方案。

作为基本案例,从以下最小案例开始,具有以下文件结构:

myproj
├── a.py
├── b.py
└── test/
    ├── a.py
    └── b.py

...以及以下内容

# a.py
def hello():
    print 'hello world'
# b.py
def bye():
    print 'good-bye world'
# test/a.py

import unittest
import a

class TestA(unittest.TestCase):
    def test_hello(self):
        self.assertEqual(a.hello(), None)
# test/b.py

import unittest
import b

class TestB(unittest.TestCase):
    def test_bye(self):
        self.assertEqual(b.bye(), None)

展示一个人如何讲述unittest运行测试test/a.py,以及如何运行“所有测试test”。(后者应该继续工作,即使新的测试脚本被添加到test,或者删除一些当前的测试脚本。)


对迄今为止提出的建议进行的最低限度测试表明它们不起作用。例如:

% python -m unittest discover -s test -p '*.py'
EE
======================================================================
ERROR: test_hello (a.TestA)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/SHIVAMJINDAL/myproj/test/a.py", line 6, in test_hello
    self.assertEqual(a.hello(), None)
AttributeError: 'module' object has no attribute 'hello'

======================================================================
ERROR: test_bye (b.TestB)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/SHIVAMJINDAL/myproj/test/b.py", line 6, in test_bye
    self.assertEqual(b.bye, None)
AttributeError: 'module' object has no attribute 'bye'

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (errors=2)
% tree .
.
├── a.py
├── b.py
├── __init__.py
└── test/
    ├── a.py
    ├── b.py
    └── __init__.py

1 directory, 6 files

1 This constraint is very much intentional, and it is an integral part of the problem presented here. (IOW, a "solution" that entails relaxing this constraint is in fact not a solution.)


我能够使你的方法发挥作用,但几乎没有什么需要和强制性的改变。

  1. 测试应该在父目录上下文中运行
  2. 主文件夹和测试文件夹都应该有一个__init__.py
  3. 测试中的导入应该是相对导入而不是直接导入

下面是我的树结构

root@5db7ad85dafd:/project# tree
.
 __init__.py
 a.py
 test
     __init__.py
     a.py

1 directory, 4 files

root@5db7ad85dafd:/project# python --version
Python 2.7.9

项目/a.py

hello = 'tarun'

项目/测试/a.py

import unittest
from .. import a

class TestStringMethods(unittest.TestCase):
   def test_abc(self):
       assert a.hello == "tarun"

注意from .. import a这对于它的工作很重要

接下来我们在项目的根文件夹中运行测试,如下所示

root@5db7ad85dafd:/project# python -m unittest discover -t .. -s test -p "*.py"
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

-t这里设置顶级导入目录,因此我们的相对导入可以工作-s告诉我们的测试在哪个目录中-p告诉我们应该以什么模式发现测试

当您想运行单独的测试时,您将执行如下操作

python -m unittest discover -t .. -s test -p "a.py"

or

python -m unittest discover -t .. -s test -p "*.py" a

图片永远比文字更有价值

Unit Tests working

Edit-1

看到彼得的答案后想更新我的答案。我没有提到从固定命名包导入的原因是,这意味着您需要知道克隆代码的文件夹的名称,并且强制它保持不变。但如果您仍然想采用这种方法,那么一种方法是将实际内容移动到子文件夹中

所以它会是repo/project/test/a.py然后在你的测试中你将使用

from project import a

然后从 repo 文件夹中运行它,如下所示

root@5db7ad85dafd:/repo# python -m unittest discover -v -t project -s project.test -p "*.py"
test_abc (test.a.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

或者像下面的测试文件夹一样

root@5db7ad85dafd:/repo/project# python -m unittest discover -v -t .. -s test -p "*.py"
test_abc (project.test.a.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

在这种情况下,将项目文件夹从根目录移动一级,将确保项目名称不依赖于克隆项目的文件夹

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何运行 test/a.py 形式的单元测试? 的相关文章

随机推荐

  • 通过浏览器上传大文件(100 GB)

    有没有办法上传大文件 超过 80 GB 通过网络浏览器 以前我一直使用 plupload 上传文件 img png jpg 但它似乎不适用于较大的文件 我还想知道如何实现一个用户可以上传的网页 例如 Mega co nz 或 Drive g
  • context:annotation-config 是 @AutoWired 的替代品吗?

    我可以这样说吗 context annotation config在我的 XML 配置中 它会自动注入 bean 类而不需要任何注释 因此 不要使用这些注释类型 public class Mailman private String nam
  • Flask-Restless 转储 Flask-Sqlalchemy 中的十进制值

    我有这个使用 Flask SQLAlchemy 的模型 class Menu Document db Model id db Column db Integer primary key True autoincrement True nam
  • 如何通过home-brew m1 mac安装anaconda

    我刚买了一台 m1 Mac 并使用 home brew 安装了 anaconda brew install anaconda 看起来它工作得很好 除了当我真正去使用 anaconda 并输入 conda 时 我得到了可怕的 conda 命令
  • 在 Python 中求解具有时滞的 ODE

    任何人都可以给我一些建议 如何解决Python中实现了时间延迟的ODE 我似乎无法弄清楚如何使用 scipy integrate odeint 来做到这一点 我正在寻找的内容应该如下所示 the constants in the equat
  • 如何在控件中嵌入 firemonkey 表单?

    我尝试在滚动框中嵌入表单 procedure TfrmMain FormCreate Sender TObject var Control TControlView begin Control TControlView Create Sel
  • 用 Emacs 替换正则表达式

    我正在尝试做一个搜索并用正则表达式替换 假设我有一个foreach foo1 txt foo2 txt foo3 txt foo4 txt 我想在列表中的每个项目周围加上 我认为 从文档 这个正则表达式可以工作 foo 1 4 txt gt
  • glmnet 如何计算最大 lambda 值?

    The glmnet包使用了一系列LASSO调整参数lambda从最大缩放lambda max在此情况下不选择预测变量 我想知道如何glmnet计算这个lambda max价值 例如 在一个简单的数据集中 set seed 1 librar
  • 如何使用正则表达式前瞻来限制输入字符串的总长度

    我有这个正则表达式 想要添加限制总长度不超过 15 个字符的规则 我看到了一些前瞻示例 但它们不太清楚 你能帮我修改这个表达式以支持新规则吗 A Z A Z 既然您在标题中提到了这一点 那么对您的案例的负面展望将是 16 regex goe
  • Ruby 中重做和重试语句的用途是什么?

    我能想到的唯一用例redo适用于写入套接字或从数据库读取等操作 但如果这些操作失败一次 后续尝试很可能也会失败 所以对我来说这仍然有点毫无意义 至于retry我真的想不出它会有什么用处 这对我来说似乎毫无意义 因为我不知道也不使用 Ruby
  • CanExecuteCommand 对性能有影响吗?

    使用 ICommand 对象的 CanExecuteCommand 对性能有何影响 该方法是否一遍又一遍地执行 我需要迭代大约 200 个对象的集合 根据这些对象决定是否应启用绑定到命令的按钮 CanExecuteCommand 是否会重复
  • 使用 JNA 的 C 回调使 JRE 崩溃

    我在 JNA 中处理回调时遇到问题 我正在尝试使用 C API 它使用回调来处理多个会话事件 登录 注销 连接问题 会话对象 称为sp session 是一个不透明的结构 所有回调都注册在sp session callbacks结构 根据
  • jQuery 分页 + Twitter Bootstrap

    我正在尝试修改 Jquery 分页 基于这个 Jquery 分页教程 demo 与很棒的 twitter bootstrap 一起工作 Twitter Bootstrap 的标准分页设置如下所示 因此这就是分页输出结构的目标 div cla
  • Android Studio 中的 NDK 集成错误

    我正在使用 Android studio 版本 1 3 1 并尝试通过转到 local proprties 并编写 ndk dir 来集成 NDK 但出现此错误 错误 任务 tesstwo compileReleaseNdk 执行失败 错误
  • Android 连续语音识别返回 ERROR_NO_MATCH 太快

    我尝试实现连续语音识别机制 当我开始语音识别时 我在 logcat 中收到以下消息 06 05 12 22 32 892 11753 11753 com aaa bbb D SpeechManager startSpeechRecognit
  • 如何在 Java 中比较字符串?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我一直在使用 我的程序中的运算符来比较到目前为止我的所有字符串 然而 我遇到了一个错误 将其中一个更改为 equals 相反 它修复了该错误 Is 坏的 什么时
  • 如何通过环境在 aurelia 中设置常量

    我希望将我的 API 基本 URL 更改为dev to prod 在 Angular I 用户中使用config json文件 后来使用注入到应用程序中grunt env 如果您使用奥里利亚 CLI 它将生成一个environments你的
  • 如何在代码编辑器中禁用自动完成代码语句?

    每次我打字if然后按空格键 Delphi 完成它if True then和上面一个新的空行 有没有办法去除this 自动完成 功能或至少编辑它以不创建新行 来自工具 选项 编辑器选项 代码洞察菜单中 取消选择代码模板完成下的自动完成复选框
  • 如何以精确的时间(即 10 毫秒)定期运行 Erlang 进程

    我想每 10 毫秒运行一次定期的 erlang 进程 基于挂钟时间 10 毫秒应该尽可能准确 正确的实施方法应该是什么 如果您想要真正可靠和准确的定期过程 您应该依靠实际的挂钟时间使用erlang monotonic time 0 1 如果
  • 如何运行 test/a.py 形式的单元测试?

    是否可以实现一个具有如下文件结构的Python项目 myproj a py b py c py test a py b py c py Note in particular that the test scripts under test