【发布时间】:2012-10-03 18:55:19
【问题描述】:
我了解如何实施单元测试,但我只是在努力弄清楚何时使用它们。
假设我有一个基本的提醒应用程序。用户可以添加/编辑/删除提醒并在表格视图中查看它们。我要为应用的哪些部分设置单元测试?
【问题讨论】:
-
您的“代码单元”,例如类、方法等
标签: iphone ios unit-testing
我了解如何实施单元测试,但我只是在努力弄清楚何时使用它们。
假设我有一个基本的提醒应用程序。用户可以添加/编辑/删除提醒并在表格视图中查看它们。我要为应用的哪些部分设置单元测试?
【问题讨论】:
标签: iphone ios unit-testing
理想世界的回答会说每一行你编写的代码都应该进行单元测试。
但是让我们暂时忘记这一点,回到现实世界。为重要的代码编写测试并且拥有另一道防线是值得的。换句话说,测试简单地为一个字段赋值的构造函数是否有意义?很可能不是。对从客户提供的复杂 XML 中提取帐户数据的解析器进行单元测试是否值得?可能是的。
这种差异从何而来?两个主要原因:
为什么要区分?为什么要测试这个而不是那个?简单地测试一切会不会更容易(正如理想世界的答案所暗示的那样)?
没有。由于时间和金钱的限制。编写代码需要两者。有人愿意为你的产品支付一定数量的钱,就像他只需要一定的时间等待产品交付一样。有些测试根本不值得(再次,构造函数代码示例)。请记住,单元测试不能幸免于diminishing returns(测试覆盖 80% 的代码库可能需要额外 20% 的开发时间,然后节省 20% 的调试/维护时间,而另外 10% 的时间可能是两倍消耗但产生的收益要少得多)。
再一次,你可能想问“线路在哪里?”你什么时候决定“好吧,这段代码的单元测试真的不需要”?不幸的是,这种判断来自经验。编写代码,阅读代码,看看其他人(可能更有经验的开发人员)做什么和学习。
如果我要给出几个通用的建议(单元测试的内容),这些建议是:
【讨论】:
测试您编写的所有代码。如果你想变得很酷,write the test first。如果你在模型或控制器上有一个方法,你也应该对它进行测试。
在不了解您的代码的情况下,很难给出建议。但听起来你会有一个控制器(如RemindersController)和一个模型(如Reminder)。这将是我要开始的基本大纲:
提醒控制器
提醒
initWithMessage:atTime:应该设置消息initWithMessage:atTime:应该设置时间【讨论】:
假设您将提醒存储在某个地方,也许在 plist 中。你可以编写一个单元测试来生成一个 Reminder 对象,存储它,检索数据,最后生成一个可用的 Reminder 类对象。
这样你就知道了几件事:
答:您的提醒生成正在工作
B:您存储数据的方法有效
C:从数据转到您的提醒对象正在工作
但是,您不应期望能够对应用的实际“功能”进行单元测试。例如触摸事件或导航控件。这些应该留给验收测试,这是一个完全不同的讨论。
【讨论】:
我在选择编写什么类型的测试以及何时编写测试时遵循以下原则:
专注于编写端到端测试。与单元测试相比,您在每个测试中覆盖的代码更多,因此可以获得更多的测试收益。让这些成为整个系统的基本自动化验证。
围绕复杂逻辑块编写单元测试。在端到端测试难以调试或难以编写的情况下,单元测试是值得的足够的代码覆盖率。
等到您测试的 API 稳定,再编写任一类型的测试。您希望避免重构您的实现和测试。
Rob Ashton 有一个关于这个主题的 fine article,我大量引用该主题来阐明上述原则。
【讨论】: