首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Protractor E2E -如何管理数据库?

Protractor E2E -如何管理数据库?
EN

Stack Overflow用户
提问于 2014-08-13 07:38:31
回答 4查看 3K关注 0票数 22

我目前正在使用Node + Angular堆栈,并利用Karma和Protractor进行测试。

我目前很难弄清楚如何处理创建和编辑数据的E2E测试,以及加载预期数据的需求。

在google上搜索会找到很多不同的自定义方法。我经常读到“你应该设置你的数据”或者“只是创建一个模拟”,而没有深入到常见过程的更多细节。其他人在从头开始创建一个全新的模拟模块时投入了太多的开销。

我只想知道人们目前是如何做到这一点的,这方面有没有标准?或者人们倾向于嘲笑后端?模仿后端似乎也不像在Karma中那样简单,因为你在浏览器范围内。

正如我所期望的那样,我正在使用MongoDB,所以如果能得到一些关于其他人在这个场景中做什么的方向,那就太好了。特别是通过Protractor自动加载夹具和清理数据库会更好。

EN

回答 4

Stack Overflow用户

发布于 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)第三种方法是初始化一个仅用于测试的数据库。这意味着在初始化数据库时,只需确保只存在测试所需的数据即可。运行测试,然后销毁数据库。这样,您将需要维护数据库启动脚本,以便将不同的值添加到不同的表中。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-08-13 20:03:16

量角器仅用于e2e测试。这意味着,它与您的数据库没有任何关系。您可以使用任务运行器(如grunt或gulp)来清理和填充您的数据库,然后让任务运行器启动您的量角器测试(我从未做过最后一次测试,但我认为这是可能的)。我知道这不是你想要的答案,但也许我可以给你指个正确的方向。

票数 0
EN

Stack Overflow用户

发布于 2019-09-22 16:59:39

您可以通过REST API (web服务)管理数据库。

我想展示一个例子,如何使用带有protractor的web服务从数据库中删除用户。在我的示例中,我使用Oracle作为数据库。

代码语言:javascript
运行
复制
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方法还可以插入数据。

您可以在beforeAllafterAll中的describe中使用Queries。例如,在beforeAll上创建一些用户,在afterAll上删除它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25275810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档