为什么我的doctest测试用例放在一个单独的文件中会失败?

时间:2013-11-14 13:54:46

标签: python doctest

我编写了一个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时,此测试工作正常,但它现在失败了。有关在我的测试文件中需要更改的内容的任何想法吗?

1 个答案:

答案 0 :(得分: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的{​​{1}}消费与...变量a37adec部分匹配,在>符号之前,并且在回车符上失败。

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

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