当前位置: 首页 > article >正文

解读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的价值相对有限,因此在优化测试过程和测试用例时,测试人员应该尽可能地避免这种现象的出现。如果无法避免,测试人员应该注意分析测试结果,找出根本原因,并尽快解决这些问题。


http://www.kler.cn/a/1367.html

相关文章:

  • 数字孪生电网有什么作用?实时云渲染技术又如何赋能智慧电网?
  • 4 $ 符号
  • LabVIEW 系统诊断
  • Vue3+Element给表单设置多个验证+规则Rules自定义
  • execl条件比较两个sheet每个单元格的值
  • 攻防世界 wtf.sh-150
  • 并发基础之线程池(Thread Pool)
  • SpringBoot(微服务)注册分布式Consul
  • 第十四届蓝桥杯三月真题刷题训练——第 15 天
  • Linux环境C语言开发基础
  • 进程和线程的区别和联系
  • Linux分文件编程:静态库与动态库的生成和使用
  • Java二叉树的前中后序遍历
  • Hive 数据倾斜
  • 超详细的堆排序,进来看看吧。
  • ESP32设备驱动-LM35温度传感器驱动
  • 深入理解WebSocket协议
  • Ribbon负载均衡的原理(源码分析)
  • 网络编程1(网络背景知识)
  • 全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里
  • win10下使用docker运行部署nginx,mysql
  • java如何创建线程
  • JVM监控搭建
  • 改进YOLO系列 | CVPR2023最新 PConv | 提供 YOLOv5 / YOLOv7 / YOLOv7-tiny 模型 YAML 文件
  • day2 —— 判断字符串中的字符是否唯一
  • *p++,*(p++),*++p,(*p)++区别?