解读Flaky Test
软件质量保障:所寫即所思|一个阿里质量人对测试的所感所悟。
Flaky Tests是什么?
初识Flaky Tests源于一个Python库-flaky,flaky是Nose和Pytest的一个扩展库,可以自动重试执行不稳定的测试。在理想情况下,我们期望测试可以稳定地执行通过或失败,但测试执行并非依赖测试用例本身,而且依赖其他执行用例所必需的元素如用例本身引用的第三方组件、环境等。Flaky则可以降低这些因素对用例的影响,当测试执行失败可以自动重试执行。
Flaky Tests是什么呢?所谓Flaky Tests,就是指在被测对象和测试条件都不变的情况下,有时候执行失败、有时候执行成功的测试,因此可以把Flaky Tests理解为不稳定的测试。
注:这里的不稳定是在大量的自动化测试数据统计前提下而言。
下面这个case就是一个Flaky Test:
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class FlakyTest {
@Test
public void testShoppingCart() {
WebDriver driver = new ChromeDriver();
driver.get("https://item.jd.com/13078543.html");
driver.findElement(By.id("add_button")).click();
String itemCount = driver.findElement(By.id("item_count")).getText();
assertEquals("1", itemCount);
driver.quit();
}
}
这个测试用例测试的是一个在线购物网站上的购物车功能。它会打开购物车页面,添加一个商品,然后检查购物车中的商品数量是否正确。
但是,由于网络延迟或服务器负载等原因,商品详情页面的加载可能会失败,导致测试失败。因此,这个测试用例是一个Flaky Test。
要解决这个问题,我们可以使用重试机制来重新运行失败的测试用例。例如,我们可以使用JUnit Jupiter中的@RepeatedTest注解来重复运行测试用例:
import org.junit.jupiter.api.RepeatedTest;
public class FlakyTest {
@RepeatedTest(3)
public void testShoppingCart() {
WebDriver driver = new ChromeDriver();
driver.get("https://item.jd.com/13078543.html");
driver.findElement(By.id("add_button")).click();
String itemCount = driver.findElement(By.id("item_count")).getText();
assertEquals("1", itemCount);
driver.quit();
}
}
这样,如果测试用例在第一次运行时失败,它将在最多尝试3次后重新运行,以增加测试的稳定性。
Flaky Tests的危害
Flaky Tests的存在可能会给软件质量带来严重的风险,具体表现为:
1. 误导测试结果:由于测试结果不稳定,Flaky Tests可能会导致测试报告中的错误率不准确,给软件质量评估带来误导。
2. 损害测试可靠性:Flaky Tests可能会导致测试人员失去对测试过程和测试结果的信心,从而导致测试可靠性降低。
3. 浪费时间和资源:Flaky Tests可能会浪费测试人员的时间和公司的资源,因为它们需要反复运行才能确定测试结果。
4. 延误发布时间:由于Flaky Tests需要额外的修复和调试,它们可能会导致软件发布时间延迟,从而影响软件的交付时间和客户满意度。
Flaky Tests产生的原因
导致Flaky Tests的原因有很多,以下是一些常见的原因及其案例:
1. 并发问题
例如:多个测试用例同时尝试访问共享资源时可能会产生竞争关系,从而导致测试结果不稳定。
2. 外部依赖
例如:测试用例依赖于外部服务,例如数据库或API,这些服务可能会在测试运行期间出现故障或变化,从而导致测试结果不稳定。
3. 时间问题
例如:测试用例的执行时间可能会因为系统负载或其它因素而变化,从而导致测试结果不稳定。
4. 随机性
例如:测试用例包含随机数据或随机行为,这些随机因素可能导致测试结果不稳定。
5. 环境问题
例如:测试用例在不同的测试环境中可能会表现出不同的行为,例如在Windows和Linux操作系统下的测试结果可能会不同。
6. 编码错误
例如:代码实现错误或测试用例设计错误可能导致测试结果不稳定。
7. 不合理的测试用例
例如:测试用例的预期结果不清晰或者不合理,可能导致测试结果不稳定。
在解决Flaky Tests问题时,需要仔细分析测试用例的执行情况,找出导致测试结果不稳定的根本原因,并采取适当的措施来解决这些问题。
Flaky Tests真的就没有价值吗?
虽然Flaky Tests的存在会对测试过程和测试结果带来风险,通过辩证法看待问题,难道Flaky Tests真的就没有价值吗?其实在某些情况下,Flaky Tests也是具有一定的价值。
1. 发现系统性问题:Flaky Tests在某些情况下揭示系统中存在的重要问题,这些问题在稳定运行的测试用例中可能不会被发现。通过仔细分析Flaky Tests的结果,测试人员能够确定系统中的潜在问题,并加以解决。
2. 探测外部依赖问题:Flaky Tests可能揭示外部依赖问题,例如网络延迟或其他不稳定的外部服务,这些问题在正常测试用例中可能不会被发现。通过解决这些外部依赖问题,测试可靠性和软件质量可能会得到显著提高。
3. 完善测试用例:Flaky Tests可以帮助测试人员发现测试用例的缺陷或不足,例如测试用例设计不合理或测试用例中缺少关键信息。通过修复这些问题,测试用例的覆盖率和准确性可以得到提高。
需要注意的是,Flaky Tests的价值相对有限,因此在优化测试过程和测试用例时,测试人员应该尽可能地避免这种现象的出现。如果无法避免,测试人员应该注意分析测试结果,找出根本原因,并尽快解决这些问题。