首页 文章

REST apis中的存根数据,用于大型系统/集成测试

提问于
浏览
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"}, {...}, ...}

现在,让我们说 I want to set up some sample data and write some tests against the GET /account resource within some specified creation date range .

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

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 /帐户资源?还有另一种方式我没想到那更优雅吗?

1 回答

  • 1

    有很多方法可以做到这一点,你已经提出了一些可靠的解决方案(尽管可能并不完美) .

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

    这个post至少为持久性方面提供了一个很好的例子 .

    顺便说一下,不要仅仅为了促进测试而更改服务的API . 也许我误会了,你不管怎么说,但我想我会提到以防万一 .

    希望有所帮助 .

相关问题