【问题标题】:Is there a way to write a selenium script for something that will take a long time?有没有办法为需要很长时间的东西编写硒脚本?
【发布时间】:2015-09-09 12:03:37
【问题描述】:

背景

我有一个允许公司做广告的网站。该程序的一部分是选择开始和结束广告的日期。这意味着广告应该在其日期到来之前处于非活动状态。

我正在使用带有 Testng、Maven 和 Jenkins 的 selenium 测试在我的服务器上运行无头测试。这些测试应该涵盖网站的每个区域,我刚刚接触到广告,但看不到我将如何测试广告。

我的测试需要制作一些广告并查看它是否在第二天上线,但我看不到如何使用 selenium 进行测试。

我可以用我的脚本创建广告没问题,但如果没有像一天长线程睡眠这样的愚蠢行为,就看不到它明天是否上线。

问题

这种测试是否可以通过变通方法进行?或者这是 Selenium 无法处理的事情?或者我的做法不对?

【问题讨论】:

  • 我在这里看到了两个测试。 1 创建广告并 2“激活”它。通过自动化测试,您应该随时使用正确的配置或以前的任务来测试这两项。
  • 您不能为当天创建一个广告,重新启动服务器并测试它是否变为活动状态吗?如果该测试成功,则该功能适用​​于任何日期。

标签: java selenium testing automated-tests


【解决方案1】:

或者这是 Selenium 无法处理的事情?

Selenium 可能可以处理它。您必须定期轮询以确保 Selenium 的某些部分不会因为认为另一部分已死而决定超时。您可以通过执行一个空的 JavaScript 脚本 (executeScript("")) 来做到这一点。但是,我根本不建议这样做,因为...

或者我的方法不对?

是的,你是。您应该做的是设计您的测试,以便您不必必须等待一天才能查看逻辑是否正常运行。每当我测试将在未来的最后期限内交付结果的过程时,我确保我有能力在测试中不需要测试暂停超过执行测试绝对需要的时间。有很多方法可以做到这一点,最好的方法取决于您在问题中没有分享的应用程序细节。有时覆盖配置选项效果很好。有时改变系统确定时间的方式效果很好。有时你需要别的东西。

测试期间花费的等待时间是每次运行测试时都会重复发生的成本。在一个项目的整个过程中,这可能会导致长达数周的生产力损失。

【讨论】:

    【解决方案2】:

    您可以将now 的计算提取到服务中

    public interface DateSource {
        Date getNow();
    }
    

    在生产中,这可以获得当前日期

    public class DefaultDateSource implements DateSource {
        public Date getNow() {
           return new Date();
        }
    }
    

    在测试中,你可以有一个可配置的 DateSource

    public class TestDateSource implements DateSource {
        private Date now;
    
        public Date getNow() {
           if (now == null) throw new RuntimeException("TestDateSource not setup");
           return now;
        }
    
        public void setNow(Date now) {
           this.now = now;
        }
    }
    

    使用您选择的 IOC 容器,您可以将 @InjectDateSource 配置到您的服务中。对于测试,您可以注入 TestDateSource 并根据需要调整值。

    示例用法:

    public class AdvertisingService {
        private final DateSource dateSource;
    
        public AdvertisingService(DateSource dateSource) {
           this.dateSource = dateSource;
        }
    
        public boolean isActive(Advert advert) {
           Date now = dateSource.getNow();
           return advert.startDate.before(now) && advert.endDate.after(now);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有一个类似的情况:我需要测试 2 个点之间的 XML 消息交换。我已经编写了从 A 点发送到 B 点的测试,显然我不能在单元测试中等到 B 点向 A 点发回一条消息。对于单元测试,我所做的是:

      1. 您需要编写 2 个类: (1) 负责收集每个日期的“广告活动”,并开始广告。 (2) 完成所有应完成的广告的课程。

      2. 在“真实”网站中,实现一个调用上面创建的类的计时器进程。没有其他的。

      3. 在您的单元测试中(不必是 selenium),创建一个具有特定日期的广告。 “to”可能在“start”之后 1 秒,因此您只需要线程休眠 1 秒或 2 秒。

      HTH

      【讨论】:

        【解决方案4】:

        Selenium 不会为您提供有关“何时测试”的开箱即用信息,但您可以使用 Quartz 调度程序之类的东西,使用 cron 表达式在您的套件中在某些固定时间运行测试。文档here

        【讨论】:

        • 我正在使用 Maven 创建测试包,并使用 Jenkins 在我的服务器上运行它们,包括调度。
        • 您能否为 Selenium 脚本添加一个 Jenkins 构建任务,然后在测试确定的时间从 command-line 启动它,例如通过 ProcessBuilder 对象? (你说“我的测试需要做一些广告,看第二天能不能上线”,所以激活日期应该是测试知道的)
        猜你喜欢
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        相关资源
        最近更新 更多