gpt4 book ai didi

unit-testing - 如何在实际项目中选择 TDD 起点?

转载 作者:行者123 更新时间:2023-12-03 14:37:35 28 4
gpt4 key购买 nike

我已经阅读了大量文章,看过大量关于 TDD 的截屏视频,但我仍在努力在实际项目中使用它。我的主要问题是我不知道从哪里开始,第一个应该是什么测试。
假设我必须编写调用外部系统方法(例如通知)的客户端库。
我希望这个客户按如下方式工作

NotificationClient client = new NotificationClient("abcd1234"); // client ID
Response code = client.notifyOnEvent(Event.LIMIT_REACHED, 100); // some params of call

在幕后有一些翻译和消息格式准备工作,所以我想对我的客户端应用程序隐藏它。

我不知道从哪里开始,如何开始。
我应该为这个库编写一些粗略的类吗?
我应该从测试 NotificationClient 开始,如下所示
public void testClientSendInvalidEventCommand() {
NotificationClient client = new NotificationClient(...);
Response code = client.notifyOnEvent(Event.WRONG_EVENT);
assertEquals(1223, code.codeValue());
}

如果是这样,通过这样的测试,我被迫立即编写完整的工作实现,没有 TDD 状态的婴儿步骤。我可以在 Client 中模拟一些东西,但是我必须知道这个东西要预先模拟,所以我需要一些预先设计。

也许我应该从底部开始,先测试这个消息格式化组件,然后在正确的客户端测试中使用它?

正确的方法是什么?
我们是否应该始终从头开始(如何处理需要的这一巨大步骤)?
我们可以从实现所需功能的一小部分的任何类开始吗(如本例中的格式化程序)?

如果我知道我的测试在哪里进行,那么对我来说就容易多了。

最佳答案

我将从这一行开始:

NotificationClient client = new NotificationClient("abcd1234"); // client ID

听起来我们需要一个 NotificationClient,它需要一个客户端 ID。这是一件很容易测试的事情。我的第一个测试可能类似于:
public void testNewClientAbcd1234HasClientId() {
NotificationClient client = new NotificationClient("abcd1234");
assertEquals("abcd1234", client.clientId());
}

当然,它一开始不会编译——直到我编写了一个 NotificationClient 类,该类带有一个接受字符串参数的构造函数和一个返回字符串的 clientId() 方法——但这是 TDD 周期的一部分。
public class NotificationClient {
public NotificationClient(string clientId) {
}
public string clientId() {
return "";
}
}

此时,我可以运行我的测试并观察它是否失败(因为我已将 clientId() 的返回值硬编码为空字符串)。一旦我的单元测试失败了,我就会编写足够的生产代码(在 NotificationClient 中)来让测试通过:
    public string clientId() {
return "abcd1234";
}

现在我所有的测试都通过了,所以我可以考虑下一步该怎么做。很明显(好吧,对 me 很明显)下一步是确保我可以创建 ID 不是“abcd1234”的客户端:
public void testNewClientBcde2345HasClientId() {
NotificationClient client = new NotificationClient("bcde2345");
assertEquals("bcde2345", client.clientId());
}

我运行我的测试套件并观察到 ​​testNewClientBcde2345HasClientId() 失败而 testNewClientAbcd1234HasClientId() 通过,现在我有充分的理由向 NotificationClient 添加成员变量:
public class NotificationClient {
private string _clientId;
public NotificationClient(string clientId) {
_clientId = clientId;
}
public string clientId() {
return _clientId;
}
}

假设没有出现打印错误,这将使我的所有测试都通过,我可以继续下一步。 (在您的示例中,可能会测试 notifyOnEvent(Event.WRONG_EVENT) 返回 Response,其 codeValue() 等于 1223。)

这有帮助吗?

关于unit-testing - 如何在实际项目中选择 TDD 起点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7987372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com