刚刚为一个新的 Web 应用程序设置了一个测试框架,我意识到我错过了一个大问题:“我如何使测试彼此独立?”
几年前,我设置了一些复杂的 Ant 脚本来执行删除所有数据库表、再次创建模式、添加测试数据、启动应用程序、运行一个测试然后停止应用程序的完整周期。由于运行整个套件需要时间,因此维护起来很痛苦,并且限制了我们进行夜间测试。它仍然值得,但我想知道是否有更简单的方法。
这种方法有替代方案吗?主要标准是每个测试都不应受到套件中任何其他测试的影响,无论它是失败还是成功。
刚刚为一个新的 Web 应用程序设置了一个测试框架,我意识到我错过了一个大问题:“我如何使测试彼此独立?”
几年前,我设置了一些复杂的 Ant 脚本来执行删除所有数据库表、再次创建模式、添加测试数据、启动应用程序、运行一个测试然后停止应用程序的完整周期。由于运行整个套件需要时间,因此维护起来很痛苦,并且限制了我们进行夜间测试。它仍然值得,但我想知道是否有更简单的方法。
这种方法有替代方案吗?主要标准是每个测试都不应受到套件中任何其他测试的影响,无论它是失败还是成功。
记录一下:我现在正在做的是在应用程序中配置一个特殊资源,它会重置整个数据库(删除所有内容,添加默认用户)。仅当应用程序以“测试模式”启动时,此资源才绑定到 URL。由于我们的应用程序(大部分)是 RESTful 的,所以无论如何都可以从外部添加新对象。我们测试的基类在设置测试用例期间调用资源。
我不太喜欢这个解决方案,因为它需要对被测应用程序进行更改,并且存在潜在的安全风险。事实上,在删除任何内容之前,我至少测试了 3 次标志,如果设置了标志,则首页上会出现一个大的、红色的、闪烁的标题(十年来第一次使用闪烁标签的好借口)。但还是有点吓人。
调整数据库进行测试可以使事情变得更快。办公室。这取决于您使用的数据库类型...通过数据库集成测试,您可以简单地回滚您的事务。通过其他集成测试,您可以简单地模拟数据访问层。
通过功能测试,您别无选择,只能使用真实数据库测试您的系统...
我目前正在试验事件溯源,这可以通过制作固定装置来提供很大帮助。该技术的简短描述:您需要 DDD(也建议使用 CQRS),将域事件保存在事件存储中,然后您可以通过从事件存储中获取相关事件来构建当前状态并重放它们序列。您可以在此事件存储之上构建许多不同的缓存数据库,它们仅包含服务组件的当前状态,仅此而已......同步过程由称为投影的类完成,称为自动同步或异步通过保存事件。所以为了制作一个夹具,你必须只存储领域事件......
例如,您可以通过一个非常简单的 REST API 编写类似这样的内容:
制作夹具:
event.storage.clear();
every.cache.clear();
var credentials = {
name: "infje",
password: "oéö9péüöáé9oilusw"
};
var resourceId = "swegretz34ze4wed";
var userDataSet = [
{
id: 1,
type: "UserCreate",
resource: resourceId,
identificationFactors: credentials,
nick: "inf3rno",
birthDate: "1333.03.03.",
hobbies: ["wall climbing"]
},
{
id: 2,
type: "UserUpdate",
resource: resourceId,
hobbies: ["base jumping", "knitting"]
}
];
event.storage.persistAll(userDataSet);
auth.cache.sync(event.storage); //a relational database with the user credentials
users.cache.sync(event.storage); //a nosql document database with the user profile
功能测试:
var response = http.get("https://my.test.api/users", credentials);
assert(response).toEqual({
size: 1,
items: [
{
id: resourceId,
nick: "inf3rno",
hobbies: ["base jumping", "knitting"],
birthDate: "1333.03.03."
}
]
});
注意:这只是概念验证代码,因此密码加密、REST 超媒体约束、投影类的自动调用等细节现在不相关。
办公室。这仍然比您原来的方法慢,但是如果您想测试真正的数据库,您无法更改该部分,并且使用事件源可以轻松地制作测试夹具、迁移数据、更改缓存数据库的结构新版本等...所以绝对值得一试...
当然...看看使用 CruiseControl 的持续集成测试。您可以将它与 NAnt 和 NUnit 一起使用来运行您的测试、拆除和设置您的环境,以及一系列其他事情。每次有人将他们的代码签入您的代码存储库时,都可以运行此程序。这是编写代码的唯一方法!