0

当您拥有可以调用 100 次并且产生相同结果的方法时,测试很简单。但是你如何测试像 Api 这样的东西,你有这样的东西:

int CreateUser(username,password); //returns the id of the user, -1 if error
int SubmitOrder(username,password,productName,quantity);//returns the id of the order -1 if error
int CancelOrder(username,password,orderId); //returns -1 if error

您将如何测试此 Api 是否有效?如何创建测试数据?我不能为它编写单元测试,我不能使用相同的测试数据,因为我不能创建一个用户两次(用户名是唯一的)。当我提交订单时,我总是得到不同的 orderIds 作为响应。

4

2 回答 2

1

您需要找到某种方法将系统“重置”到众所周知的初始状态,即没有用户也没有订单的状态。

您还需要找到一些方法来观察系统中的状态。这种方式实际上可能具有破坏性,即它可能会修改甚至损坏系统的状态,但是尽管如此。在您的情况下,方法CreateUser可以用作这样的观察者来检查用户是否已经存在,因为已知-1在这种情况下会返回。

以下是您的一个测试用例的样子:

reset (); // Each test case should start with reset
assertNotEquals (-1, CreateUser ("foo", "bar")); // This should work fine
assertEquals (-1, CreateUser ("foo", "zoo")); // Make sure user "foo" does exist
assertNotEquals (-1, SubmitOrder ("foo", "bar", "apple", 1)); // Make sure user can pass authentication
assertEquals (-1, SubmitOrder ("foo", "zoo", "apple", 1)); // Make sure password is actually checked

上面的测试用例检查是否CreateUser实际创建了具有给定名称和密码的用户,并且不允许创建两个具有相同名称的用户。

这是另一个测试用例:

reset ();
CreateUser ("foo", "bar");
orderID = SubmitOrder ("foo", "bar", "apple", 1); // Submit order
assertNotEquals (-1, CancelOrder (orderID)); // Make sure order was really created
assertEquals (-1, CancelOrder (orderID)); // Make sure order was cancelled

等等。当然,最好找到更直接的方法来观察系统状态,例如直接查询数据库。

于 2013-02-16T09:49:42.767 回答
-1

我假设你在谈论一些 OOP 语言。我认为您可以通过单元测试和依赖注入来解决您的问题。核心理念:

  • 首先你测试你的数据库类
  • 在测试 API 时,您将 FakeDataBase 类注入其中(共享相同的接口)

因此,在测试环境中,API 会写入其他一些假数据库,或者只是将查询打印到文件中,然后您只需检查该文件的内容是否符合您的预期。

很棒的视频:

http://www.youtube.com/watch?feature=player_embedded&v=wEhu57pih5w#

http://en.wikipedia.org/wiki/Dependency_injection

http://en.wikipedia.org/wiki/Unit_testing

于 2013-02-16T09:57:25.823 回答