【问题标题】:How to use if else with protractorif else 与量角器如何使用
【发布时间】:2020-07-20 05:13:36
【问题描述】:

我有非常奇怪的场景,我不知道如何处理它。

我是测试新手,我有一个网站可以测试我们检查购物车功能的工作属性。

我的问题是我们添加了 x 个产品并进行了库存检查。如果存在库存冲突,那么我们需要在继续之前解决它,否则我们就继续。

我设法创建了一个如下所示的函数:

describe("Details page", function () {

    detailsPage = new DetailsPage();

    // The details page is accessible by the specified URL
    it(`Is defined by the URL: ${userData["url"]}${browser.baseUrl}`,
        async function () {
            await detailsPage.navigateDesktop();
        });

    // Details page has a form and it can be filled out with user data
    it("Has a form that can receive user data",
        async function() {
            await detailsPage.fillFormWithUserData();
            await utils.click(detailsPage.getForm().buttons.nextStep);
        });

    if (detailsPage.hasStockConflict()) {

        // Details page allows the user to fix conflicts in stocks
        it('Enables resolution of stock conflicts', async function () {
            // Wait for stock to fully load
            await detailsPage.hasStockConflict();
            await detailsPage.clickAllRemoveButtons();
            await detailsPage.clickAllDecreaseButtons();
        });

        // Details page allows the user to proceed to the next stage when all conflicts (if any) has been resolved
        it('Allows the user to proceed to the next stage of purchasing', async function () {
            const nextStepButton = detailsPage.getForm().buttons.nextStep;
            await utils.elementToBeClickable(nextStepButton);
            await utils.click(nextStepButton);
        });
    }
});

但是我的功能问题是我需要等到我从服务器收到响应,否则我确实会遇到股票冲突,这将由以下原因触发:

hasStockConflict() //checks if there is stockConflict message in DOM

否则我将被重定向到新页面。

我的问题是,我怎样才能在功能上进行排序以检查是否存在库存冲突,然后我们解决 if 语句,否则我们只需继续而不需要做任何事情(这将带我进入下一页)?

我设置了 1 分钟的超时时间。 1分钟后测试失败。

如果存在库存冲突,基本上我想解决 if 语句,否则我们基本上跳过它。我可能误解了测试的目的,所以各种知识也将不胜感激!

【问题讨论】:

    标签: javascript selenium if-statement jasmine protractor


    【解决方案1】:

    要补充 Code-Apprentice 提到的内容,您可以设置模拟数据以获取您认为合适的响应。您应该模拟不同的响应,并根据响应在一次测试中做一件特定的事情。步骤中没有其他内容。
    在您的情况下,现在,使用您知道有库存的物品或添加始终有库存的虚拟物品,并将无库存的虚拟物品添加到您的数据库中。为两者以及您认为合适的方式编写单独的测试。

    希望对你有帮助!

    【讨论】:

    • 确实如此。我写了一篇关于 if 的评论。因此,正如您提到的,有两种测试,其中一种是检查是否有库存,另一种是基本上有虚拟物品并运行两种不同的测试。所以我想我需要有功能,如果我想运行虚拟或库存功能,我可以在参数中输入,或者你建议怎么做?
    • @ProtractorNewbie “所以正如你提到的,有两种测试,其中一种是检查是否有库存......”我认为你误解了。这里的重点是你有两个测试。 保证获得库存商品并验证以下行为是否适用于该情况。另一项测试是保证获得没有库存的商品并验证该案例的正确行为。这两项测试都不会检查该项目是否实际有货。它应该以保证特定测试所需的状态的方式构建。
    • 我们谈论的是功能标记测试用例,这有点不同。通常,我们使用功能标志来确保我们控制哪些功能处于活动状态。我们在测试开始时提供hooks,因此我们控制一个功能标志并在该测试中进行相应的测试。我建议坚持在一项测试中使用一些您认为合适的数据检查一件事。
    • @LearningEveryday 抱歉回复晚了!但我同意你和 Code-Apprentice 对我所说的话。我真的是为了更好地抓握并更了解它应该如何工作!
    【解决方案2】:

    每个测试都应针对特定事物进行测试。它们不应包含if...else 分支。相反,您应该对每个场景进行测试。每个测试都应该需要满足特定场景的初始化数据。

    你有两种不同的方法来解决这个问题:

    1. 在您查询的资源中设置数据,并为正在测试的场景请求特定数据。

    2. 模拟资源,以便请求返回为正在测试的场景策划的模拟数据。

    【讨论】:

    • 在这种情况下,这意味着如果我想测试库存冲突,我应该在这种情况下插入需要解决的产品,然后再继续,我相信对吗?如果我想做出选择,如果我想基本上测试股票冲突,你会建议什么?我想运行库存冲突功能,什么时候不运行?
    • 没有看到编辑,我在答案中添加了相同的内容!好答案!
    • @ProtractorNewbie 我已经编辑了我的答案以包含更多细节。一般来说,测试不应该决定是否调用一个函数。他们应该遵循特定的配方并验证结果是否正确。当有多个场景时,应分别测试每个场景。
    • @Code-Apprentice 更有意义!我同意。我没想到,我想我们每天都会学到一些新东西。但在那种情况下。如果我想为没有库存的物品和有库存的物品运行示例模拟数据,你会推荐我阅读什么来触发?如果你明白我的意思? :)
    • @ProtractorNewbie 应用程序中的数据来自哪里?如果您正在向 REST API 或其他一些 HTTP 资源发出请求,则可以使用诸如 nockfetch-mock 之类的库来模拟 HTTP 请求的响应。
    【解决方案3】:

    每个人都在说,应该遵循一些最佳实践以避免将来出现陷阱......

    但是,最佳做法 #1 始终取决于您的公司、您的产品和您的需求。所以如果你决定你需要走这条路,那就去吧

    为什么您的方案不起作用

    简短的回答,您的 it 块是在浏览器启动之前构建的。当时 你的函数无法运行,我假设失败或返回undefined

    回答

    话虽如此^,你不能跳过it,把你的逻辑像这样放在里面

            it('Enables resolution of stock conflicts', async function () {
              if (detailsPage.hasStockConflict()) {
                // Wait for stock to fully load
                await detailsPage.hasStockConflict();
                await detailsPage.clickAllRemoveButtons();
                await detailsPage.clickAllDecreaseButtons();
    
                const nextStepButton = detailsPage.getForm().buttons.nextStep;
                await utils.elementToBeClickable(nextStepButton);
                await utils.click(nextStepButton);
              }
            });
    

    【讨论】:

    • 哦,非常感谢!我明白你的意思,我认为我可能仍然对此有疑问。问题是detailsPage.hasStockConflict() 是一个元素。我们正在等待元素弹出的地方,如果我们在 1 分钟内没有找到它,那么它将引发超时,这将导致整个 it 函数基本上作为 FAILED 测试。我确实认为,在我们测试有效库存和库存冲突的地方进行单独测试实际上可能更好。除非你提出别的建议? :D
    • 所以我确实需要等待几秒钟,看看是否存在库存冲突。这就是我的问题所在。如果没有库存冲突,那么我们将被重定向到下一页,否则我们将收到库存冲突消息,这就是为什么我认为最好将其作为单独的测试而不是全部放在一起?
    • 在这种情况下是的,我会将它们分开。但在未来,你迟早会面临同样的问题,即整个测试用例都应该是有条件的。请记住解决方案^
    • 会的!不过我可能会马上问你。如果detailsPage.hasStockConflict(),测试用例会失败还是只有 if 语句是错误的?因为在那种情况下它会非常方便,但如果我没记错的话,当我在测试用例中间超时时,该测试用例将被视为失败。如果您对此有任何建议,请提供示例代码,我将不胜感激!
    • 作为一个选项,我只是将您对元素的期望包装在 try/catch 中,并在 try 返回 true 并在 catch 返回 false (或相反)。这样它永远不会引发错误。但是应该有更好的方法...
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多