如何在每次调用改变系统状态时测试应用程序?

时间:2013-02-16 09:41:58

标签: api testing

当您拥有可以调用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的工作原理?你如何创建测试数据?我不能写它的单元测试,我不能使用相同的测试数据,因为我无法创建用户两次(UserName是唯一的)。当我提交订单时,我总是得到不同的orderIds作为回复。

2 个答案:

答案 0 :(得分: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

等等。因此,最好找到更直接的方法来观察系统状态,例如:通过直接查询数据库。

答案 1 :(得分:-1)

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

  • 首先测试您的DataBase类
  • 在测试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