Skip to content

2023.12.22 会议记录(KotSuite 进度)

玄老师,您好:

附件为 KotSuite 项目最新的 PPT。

2023 年 12 月 22 日的会议纪要如下:

工作进度

  1. 在 Oppo 内部的项目上进行了测试生成,结果显示,目前生成的测试用例覆盖率尚可,但实际能生成测试用例的方法较少。

存在的问题

  1. 技术创新不够,只用了普通的遗传算法 -> 思考如何结合测试用例重用技术,或结合其它创新技术;
  2. 很多方法中存在 LogUtil 这种 Android.jar 包里面的语句,需要使用预 Mocking 技术将 LogUtil 类屏蔽掉,以提高能测试的方法的数量。
    1. 将预 Mocking 的对象或类写到 JSON 配置文件中,这样方便后续的添加;
    2. 将预 Mocking 的对象或类写到 JMockK 中,生成测试用例是直接调用 PreMocking 方法就可以实现预 Mocking (问题:不方便添加预 Mocking 的对象或类);
  3. 将属于 Android Test 部分的待测方法归类到了「可以测试的类」中,导致结果不够好,需要做数据筛选,看有多少待测方法是属于 Android Test 的。

目前的创新点

  1. 支持了 Kotlin 的语言特性,例如 Object 类、Data 类、Companion 类等;
  2. 支持对 Android 项目生成测试用例:难点在于需要 Mock 大量的 Android Runtime 类,在这里我们使用了 MockK + JMockK 工具链,实现了对 Kotlin 语言的 Mocking;
  3. 测试用例重用增加了算法的效率。

未来工作

  1. 思考测试用例重用技术的具体思路:结合遗传算法还是取代遗传算法
    1. 粒度上:以待测方法的参数为重用对象,如果参数类型之前有过,则直接使用之前创建的参数。如果待测方法有多个参数,则每个参数的重用对象进行组合,得到多个测试用例。
    2. 技术上:
      1. 测试用例重用结合遗传算法:重用只用在生成初始种群这一阶段,使用重用技术生成初始种群后还是需要进行遗传算法(问题:目前算法的时间瓶颈在于遗传算法中的适应度获取,这种方式无法节省多少时间)
      2. 测试用例重用取代遗传算法:如果发现参数类型均能被重用,则直接根据重用对象组合生成测试用例集,最后进行一轮筛选选出能运行的,不用再进行遗传算法的迭代(能增加算法的效率)
  2. 完成预 Mocking 功能,在 JSON 配置文件中添加需要预 Mocking 的类或对象,然后在生成测试用例时根据 JSON 配置文件添加预 Mocking 语句;
  3. 将 EvoSuite 用于 Android 项目上,看看 EvoSuite 在 Android Kotlin 上的效果如何;
  4. 将生成的测试用例在 Android Test 上尝试运行,看有多少能运行成功。

其它:Mocking 的难点与挑战

  1. Mocking 的分类:
    1. mock(Student.class):生成了一个 Student 类子类的对象
    2. spy(new Student()):需要传入一个 Student 类的对象,spy object 可以支持 when(student.bar()).thenReturns(1) 这种行为上的 Mocking,能使得测试用例变得稳定,同时能覆盖到 corner case,增加测试用例的覆盖率。
  2. 难点:when().thenReturns() 中返回值的确定容易导致 false positive,因为可能构造了一个测试场景导致测试用例失败,但这个测试场景不可能存在,因此是 false positive。

杨枫

2023.12.22