我目前正在使用Node + Angular堆栈,并利用Karma和Protractor进行测试。
我目前很难弄清楚如何处理创建和编辑数据的E2E测试,以及加载预期数据的需求。
在google上搜索会找到很多不同的自定义方法。我经常读到“你应该设置你的数据”或者“只是创建一个模拟”,而没有深入到常见过程的更多细节。其他人在从头开始创建一个全新的模拟模块时投入了太多的开销。
我只想知道人们目前是如何做到这一点的,这方面有没有标准?或者人们倾向于嘲笑后端?模仿后端似乎也不像在Karma中那样简单,因为你在浏览器范围内。
正如我所期望的那样,我正在使用MongoDB,所以如果能得到一些关于其他人在这个场景中做什么的方向,那就太好了。特别是通过Protractor自动加载夹具和清理数据库会更好。
发布于 2019-12-23 17:52:00
有三种方法可以实现这一点:
1)第一种方法是编写简单的自定义API用于测试,您可以在量角器测试开始之前使用这些API(量角器配置文件onPrepare)。在onPrepare上,您可以运行一个在数据库中创建数据的脚本,以便稍后用于测试目的。该脚本应该包含将所需的数据库条目推送到数据库的逻辑。您还可以使此脚本在量角器测试CI阶段开始之前在CI上运行。这样,您就可以在测试开始之前将所需的所有数据库条目加载到数据库中。这样做的缺点是您的测试将需要更长的时间才能开始。另一个缺点是,如果在两个测试之间进行设置,则必须在两个测试之间运行设置。
2)第二种方法是使用npm包ng-apimock。我建议不要使用它,因为模拟对于e2e测试来说不是一个好主意。即便如此,使用ng-apimock将允许您定义要模拟的API值,并将它们推送到模拟服务器。然后,您可以稍后使用selectScenario在测试中使用该值。你可以使用一个量角器ngapimock插件来实现这一点。此外,一个名为pass through的功能将允许您的API响应不使用模拟,而是使用实际的API后端。此工具用于更快的前端开发,以防后端尚未准备好。如果您使用的是ngapimock,请确保定期维护mock,否则测试将失败。
3)第三种方法是初始化一个仅用于测试的数据库。这意味着在初始化数据库时,只需确保只存在测试所需的数据即可。运行测试,然后销毁数据库。这样,您将需要维护数据库启动脚本,以便将不同的值添加到不同的表中。
希望这能有所帮助。
发布于 2014-08-13 20:03:16
量角器仅用于e2e测试。这意味着,它与您的数据库没有任何关系。您可以使用任务运行器(如grunt或gulp)来清理和填充您的数据库,然后让任务运行器启动您的量角器测试(我从未做过最后一次测试,但我认为这是可能的)。我知道这不是你想要的答案,但也许我可以给你指个正确的方向。
发布于 2019-09-22 16:59:39
您可以通过REST API (web服务)管理数据库。
我想展示一个例子,如何使用带有protractor的web服务从数据库中删除用户。在我的示例中,我使用Oracle作为数据库。
class OracleDatabaseAccess {
private readonly BASE_API_URL: string = browser.params.someUrlToYourRest;
public request<T>(query: string): promise.Promise<T[]> {
return this.get<T[]>(this.BASE_API_URL, 'sql?query=' + this.fixQuery(query));
}
public update<T>(query: string): promise.Promise<T[]> {
return this.get<T[]>(this.BASE_API_URL, 'update?query=' + this.fixQuery(query));
}
public get<T>(url: string, path: string): promise.Promise<T> {
const http = new HttpClient(url);
http.failOnHttpError = true;
const responsePromise: ResponsePromise = http.get(path);
return responsePromise.body.then(body => {
return JSON.parse(body.toString());
}) as promise.Promise<T>;
}
private fixQuery(query: string): string {
if (query.includes('%')) {
query = query.split('%').join('%25');
}
if (query.includes(';')) {
query = query.replace(';', '');
}
return query;
}
}
class Queries {
private oracleDataBaseAccess: OracleDatabaseAccess = new OracleDatabaseAccess();
deleteUser(userId: string): promise.Promise<{}> {
return this.oracleDataBaseAccess.update(`delete from users where userId='${userId}'`);
}
}
通过使用request
方法,可以从数据库中选择记录。此外,使用update
方法还可以插入数据。
您可以在beforeAll
或afterAll
中的describe
中使用Queries
。例如,在beforeAll
上创建一些用户,在afterAll
上删除它们。
https://stackoverflow.com/questions/25275810
复制相似问题