3

我已经尝试学习 Python 大约 6 周了。在这个网站上阅读了很多关于 TDD 的内容后,我买了 Roy Osherove的 The Art of Unit Testing(很棒的书!),尝试在学习 Python 的同时尝试 TDD。这本书使用.NET,但似乎没有问题。存根是存根,模拟是模拟。

当我在网上阅读和查看 TDD 示例时,我真的觉得我理解了为什么程序员会像他们那样编写代码。但是一旦我坐下来尝试自己,我一无所获。

举个昨天的例子:

我想为一个不太复杂的项目尝试 TDD。基本上,我想要的是一个类,它通过下载和解析 RSS 提要,保存一个包含(名称、日期)的元组列表。我为我的测试创建了一个新的 py 文件(还没有编写“真正的代码”)并编写了一个测试用例:

import unittest

from tv_schedule import TvSchedule

class TvScheduleTests(unittest.TestCase):
    def test_download_success_and_parse_failure(self):
        '''Successfully download RSS schedule for the specific user
           but fail parsing it'''
        self.tv = TvSchedule("User123")
        # Check if ParserException was thrown I guess


if __name__ == "__main__":
    unittest.main()

...然后我有点卡住了。我认为(大声笑!)。我真的需要一些关于这是否只是愚蠢和/或我如何才能做得更好的指示。我的直觉说我做了坏事。

我想让 TvSchedule 类在后台进行下载/解析(使用feedparser),因此您只需创建该类的一个新实例,然后就可以使用它。也许这是糟糕的设计,也很难测试?另外,我将如何消除对通过网络检索 rss 提要的依赖?通过存根并始终返回包含示例提要的内存字符串?

一旦我离开了 TDD 教程和书籍喜欢使用的非常简单的计算器示例,我就陷入了困境。:(

4

3 回答 3

4

您可能遇到的一个挑战是您的测试过于广泛。一次下载和解析意味着您将编写大量代码。尝试将第一个测试压缩一点。这可能会帮助你集中注意力。

另一个挑战可能是您编写的代码没有太多逻辑,您只是委托其他库进行下载和 RSS 解析。这使得很难解决问题。在这种情况下,这可能是一个尝试练习的相当无趣的例子。考虑尝试试驾像康威的生命游戏这样的有趣但更简单的问题。

希望有帮助!

布兰登

于 2012-05-10T14:42:33.497 回答
2

我认为您需要查看noseand mock

nose是一个很好的测试模块,它很好地补充unittest并提供了一个 CLI 命令来运行测试并使用插件为您提供有关测试平台结果的更多信息(代码覆盖率等)

mock是我们存根或模拟方法或对象的方式,这对于 HTTP 请求或与测试范围之外的服务交互的对象特别有用。

在您的示例中,我将对您的 feeder 对象进行一些修补,并将返回值设置为您的一些边缘案例并进行测试以确保它正确处理案例self.assertTrueself.assertIsInstance(继承自unittest.TestCase)等...

通常,在使用 Python 进行 TDD 时noseunittest我首先使用 a 编写 TestCase 的骨架,setUp有时使用 atearDown来处理常见的模拟和存根。对于我定义的每个测试方法,我首先模拟我必须做的,围绕单元测试设置环境,然后调用方法/对象并做出断言。

在传统的 TDD 中,您首先设计测试,然后构建代码以使您的测试绿色。红色->绿色。

于 2012-05-10T14:04:36.670 回答
2

每当您的测试标题中有“和”时,您都在测试两件事。一次测试一件事要好得多,所以我建议您应该将测试重构为两个。

其次,您希望以非常小的步骤进行。想想你接下来可以做的最小的事情,它不适用于当前的代码库。

当您没有代码时,通常最小的可能是创建目标类的示例。不要要求它做任何事情,只需创建它。

这几乎就是你所处的情况。所以你做对了!

您的代码不应编译,因为没有 TvSchedule。“不编译”算作红色。写一些代码让它编译,那就是Green。耶!

正如其他人所指出的,您应该在某处保留一个小 TODO 列表。在肯特贝克的书中,他使用便签。我喜欢在测试代码文件中有 TODO 列表。你的待办事项清单的范围应该是你打算在你将要花费的时间内完成的事情,例如半小时或两个小时或其他什么。不是一整天,只是从现在到下一次休息。然后你在你的 TODO 列表中添加和减去一些东西。帮助您专注于做“可能出错的最简单的事情”,然后再做下一步。

[编辑:添加 TODO 列表]

于 2012-05-11T00:41:17.877 回答