2

我已经编写了一个 Python 模块,并且正在使用 doctest 对其进行测试。我在模块本身中嵌入了测试,我正在调用 doctest

if __name__ == '__main__':
    import doctest
    doctest.testmod()

我期望的所有测试都通过(或失败)。这种方法的唯一问题是随着测试用例数量的增加,很难遵循代码。我已经读过 doctest 将允许您在单独的文件中进行测试,所以我正在尝试这样做。我发现当我将它们放在另一个文件中时,在我的模块中运行良好的测试失败了。

这是一个示例测试文件。

>>> from modbusServer import ModbusServer
>>> s = ModbusServer('/dev/ttyUSB0')
>>> s.server # doctest: +ELLIPSIS
<modbus_tk.modbus_rtu.RtuServer instance at 0x...>

这是我运行该测试时发生的情况

test@testpc ~/code/newmodbus $ python -m doctest test.txt 
**********************************************************************
File "test.txt", line 3, in test.txt
Failed example:
    s.server # doctest: +ELLIPSIS
Expected:
    <modbus_tk.modbus_rtu.RtuServer instance at 0x...>
Got:
    <modbus_tk.modbus_rtu.RtuServer instance at 0xa37adec>

当我从我的模块调用 doctest 时,这个测试工作得很好,但它现在失败了。关于我的测试文件中需要更改什么的任何想法?

4

1 回答 1

3

这还不是答案,但在评论中看起来会很丑。以下对我有用,你可以在你的环境中检查它:

(test)alko@work:~$ cd /tmp
(test)alko@work:/tmp$ cat test.txt
>>> from collections import deque
>>> deque().__init__ # doctest: +ELLIPSIS
<method-wrapper '__init__' of collections.deque object at 0x...>
(test)alko@work:/tmp$ python -m doctest test.txt
(test)alko@work:/tmp$

根据评论更新

由于此代码对您来说一切正常,因此您的 doctest 模块和 ELLIPSIS 指令都可以。正如您提到的文件源自 Windows,很明显,问题在于行尾。Doctest 尝试在符号之前与带有 可变部分0xa37adec>\r\n的表达式匹配,并且在回车符上失败。0x...>\n...a37adec>

您可能希望fromdos为所有源自 Windows 的文件运行实用程序。

或者,您可以(并且我建议您这样做)使用git它来管理您的开发,它会很乐意为您替换行尾。

于 2013-11-14T14:53:55.820 回答