我想开始并行运行现有的Selenium测试,但由于我当前测试的编写方式,我无法确定最佳方法。
我的大部分测试的第一步是让数据库进入干净状态,然后用其余测试所需的数据填充它。虽然这很好地将测试彼此隔离,但如果我开始在同一个SUT上并行运行这些相同的Selenium测试,他们最终会删除其他测试的数据。
经过多次挖掘,我无法找到任何有关如何处理这种情况的指导或最佳实践。我想到了一些想法,但没有一个让我觉得特别棒:
重写测试以不覆盖其他测试的数据,即只添加测试数据,永不擦除 - 我可以看到这可能导致由于每次测试运行时数据库的可变性而导致的意外故障。从不同的测试顺序到错误的故障,任何事情都可能导致其他测试失败。这只是感觉不对。
不要预先填充数据库 - 而是通过Selenium本身创建所有需要的数据。这将最能复制现实世界的使用,但也比将数据直接加载到数据库中花费更长的时间。根据每个测试用例需要多少测试数据,这可能会抵消并行化带来的任何好处。
让每个Selenium节点测试一个不同的SUT副本 - 这样,每个测试都可以随意使用数据库,因为我们假设没有其他测试同时触及它时间。缺点是我需要设置多个数据库,并且在每个测试用例的开始时,弄清楚如何协调要初始化的数据库以及如何向节点和SUT发信号通知这个特定的测试用例应该使用这个特定数据库。不是很糟糕,但如果有更好的方法,那就不是我想做的事。
让每个Selenium节点测试SUT的不同副本,但是在运行时之前将测试分解为不同的套件,每个节点一个套件 - 同样可行,但不是那么灵活,因为随着时间的推移你我希望尽可能地继续往返每个套房的长度。
总而言之,这些似乎都不是明显的赢家。选项3似乎是最合理的,但我也怀疑这是否是一种可行的方法。经过一番研究后,看起来我需要编写一个自定义测试运行器以方便并行运行测试,但有关初始测试数据的部分仍然让我寻找更好的方法。
在并行运行Selenium测试时,有没有更好的方法来处理数据库初始化?
FWIW,应用和测试套件采用PHP / PHPUnit。
因为这听起来像我正在寻找的答案是非常依赖于项目的,所以我至少会尝试提出自己的解决方案并报告我的发现。
答案 0 :(得分:0)
没有简单的答案,看起来你已经考虑了大部分内容。另外值得考虑的是重写测试以单独使用分区数据 - 这可能会或可能不会起作用,具体取决于您的域(例如,每个节点单独的银行帐户,如果它是银行应用程序)。您可以将数据库的预填充限制为静态参考数据,也可以预先填充每个单独“帐户”的数据。同样,取决于您对数据的处理方式。
但是,我倾向于投票支持3,因为这些天数据库设置相对容易编写,并且对于小型测试数据套件,硬件要求可能不会太高。