0

问题

假设我有一个很酷的 REST 资源/account

我可以创建新帐户

POST /account
{accountName:"matt"}

这可能会产生一些 json 响应,例如:

{account:"/account/matt", accountName:"matt", created:"November 5, 2013"}

我可以通过调用来查找在日期范围内创建的帐户:

GET /account?created-range-start="June 01, 2013"&created-range-end="December 25, 2013"

这也可能产生类似的东西:

{accounts: {account:"/account/matt", accountName:"matt", created:"November 5, 2013"}, {...}, ...}

现在,假设我想在某个指定的创建日期范围内设置一些示例数据并针对 GET /account 资源编写一些测试

例如,我想以某种方式将以下帐户插入系统

name=account1, created=January 1, 2010
name=account2, created=January 2, 2010
name=account3, created=December 29, 2010
name=account4, created=December 30, 2010

然后打电话

GET /account?created-range-start="January 2, 2010"&created=range-end="December 29,2010"

并验证仅返回帐户 2 和 3。

我应该如何插入这些示例帐户来编写我的测试?

可能的解决方案

1)我可以使用控制反转并允许用户指定新帐户的创建日期。

POST /account
{account:"matt", created="June 01, 2013"}

但是,即使创建的字段是可选的,我也不喜欢这种方法,因为我可能不想让我的用户能够设置他们帐户的创建日期。我当然需要能够进行测试,但将该功能作为公共 api 的一部分对我来说似乎是错误的。也许我想给在某个特定日期之前加入的任何人提供 5 美元的积分。如果他们可以指定他们的创建日期,用户就可以对系统进行游戏。不好。

2) 我可以添加一个或多个测试配置资源

PUT /account/creationDateTimestampProvider
{provider="DefaultProvider"}

或者

PUT /account/creationDateTimestampProvider
{provider="FixedDateProvider", date="June 01, 2013"}

这种方法使我能够通过安全约束锁定这些资源,以便只有我的测试上下文可以调用它们,但它也必然会对系统产生副作用,这可能会变得难以管理,特别是如果我有一堆后门配置资源。

3)我可以直接与数据库交互,完全绕过 REST api 来设置我的示例数据。

INSERT INTO ACCOUNTS ...

GET /account?...

然而,这可以让我进入使用 REST api 可能不允许我进入的状态,并且随着 db 模型的发展,维护这些 sql 脚本也可能是一种痛苦。

那么...我如何测试我的 GET /account 资源?还有另一种我不认为更优雅的方式吗?

4

2 回答 2

1

有很多方法可以做到这一点,并且您已经提出了一些可靠的(尽管可能不适合您的情况)解决方案。

在测试设置中,我会启动一个内存数据库,如HSQLDB(还有其他)并执行插入操作。测试配置会将适当的数据库配置注入您的服务提供者类。运行测试,然后在拆卸时关闭数据库。

这篇文章至少为事物的持久性提供了一个很好的例子。

顺便说一句,不要仅仅为了方便测试而更改服务的 API。也许我误解了,你也没有,但我想我会提一下以防万一。

希望有帮助。

于 2013-10-10T00:08:54.587 回答
0

对于它的价值,这些天我主要使用第二种方法来进行大多数系统级(黑盒)测试。

我创建了具有只有我的系统测试才能访问的安全要求的后门管理/测试 API。这些超级强大的 api 允许我播种数据。我尝试尽可能地限制这些 api 的范围,以便它们不会过度耦合到特定的实现细节,但足够灵活,可以指定所需的种子数据所需的任何内容。

对于 Vidya 提供的数据库解决方案,我更喜欢这种方法的原因是,我的测试不会与特定的数据存储技术耦合。如果我决定从 mongo 切换到 dynamo 或类似的东西;使用管理 api 使我不必更新我的所有测试——相反,我只需要更新管理 api/impl。

于 2018-12-28T22:28:14.427 回答