关于单元测试:适用于-androidjvm-的单测生成器-randunit

4次阅读

共计 2292 个字符,预计需要花费 6 分钟才能阅读完成。

背景

在继续交付越来越风行的明天,单测作为保障 CI 品质的重要一环也开始在国内被器重起来。

不过在单测上大家的态度还是比拟矛盾的,放心的事件次要有两个:

从 0 到 1 的第一步不晓得从何下手
万一花大力量做了之后发现没什么用怎么办
然而短少这一环,在整个 devops 流程中很多编译时重大问题会被延缓到运行时裸露,这对于我的项目效率妨碍也不小。。

于是就有了灵感起源:

主动生成一系列冒烟级别单测用例,并能发现重大问题
接入成本低,能无痛与现有流程联合
能对 android 失效(我司重挪动端

做了什么

RandUnit 取义自 Random UnitTest,他会:

依据提供的包名或入口类,搜寻所有相干的待测试类与办法
依据搜寻后果,为每个办法生成一系列 statements 用于测试
像惯例单测流程个别,在 junit 上运行这些 statements,失去测试后果
而这所有只须要一次简略的复制粘贴:

import com.williamfzc.randunit.env.NormalTestEnv
import com.williamfzc.randunit.models.StatementModel
import com.williamfzc.randunit.scanner.ScannerConfig
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class MinExampleTest(private val statementModel: StatementModel) {
    companion object {private val testEnv = NormalTestEnv()
        private const val packageName = "com.your.package"
        private val cases by lazy {val scannerConfig = ScannerConfig()
            scannerConfig.includeFilter.add(packageName)

            RandUnit.collectStatementsWithPackage(packageName, scannerConfig)
        }

        @JvmStatic
        @user3ters(name = "{0}")
        fun data(): Collection<StatementModel> {return cases}
    }

    @Test
    fun runStatements() {testEnv.runStatementInSandbox(statementModel)
    }
}

因为它是非法的 junit 用例,所以你能够在 ide 里间接运行它。间接 run with coverage 的话:

能够看到,它帮你生成了 500+ 条用例并执行了,并且达到了不错的覆盖率。

解决了啥

再回头看看是不是解决了下面的三个问题:

主动生成:目前的策略是在每次编译后主动搜寻生成一系列 junit 用例并执行,有代码变更也无需改用例
接入成本低:一次粘贴即可接入。除此之外,因为他是非法 junit 用例,那天然也能够像失常应用 junit 用例一样用它,例如在 CI 环境里
对 android 失效:得益于 robolectric 的反对, randunit 可能很好地被利用到 android 我的项目中,而不须要真机。不过下面的代码须要有微调,感兴趣能够看看我的项目主页。
像这种问题:

override fun getCastOptions(context: Context?): CastOptions? {

    // oh, you import a non-existed class here!
    // it should cause a ClassNotFoundException
    Class.forName("import unknown class here!")

    ...
}

该类型问题在编译期并不能被发现,问题越晚裸露 == 修复老本越高。应用之后就不会被脱漏到集成之后啦:

WARNING: error happened inside sandbox: java.lang.reflect.InvocationTargetException

java.lang.ClassNotFoundException: import unknown class here!

    at org.robolectric.internal.bytecode.SandboxClassLoader.getByteCode(SandboxClassLoader.java:158)

什么时候举荐应用 randunit

  • 在之前很长一段时间的察看里,无论我的项目大小,仍旧有大量开发中的我的项目处在没有任何单元测试的状态中。随着 devops 的风行,继续化的自动化测试简直曾经成为整个麻利流程中最为要害的一环。
  • 而在这种状况下其实很多业务认知到了这一阶段的重要性,但不晓得从何下手
  • 这个我的项目的出发点就是,用尽可能少的老本将单元测试跑起来,至多将这里的空缺填补起来

举荐应用的状况

你的我的项目目前还处于裸奔的状态,或单元测试做得不好的状态

不举荐应用的状况

你想要一个彻底发现问题并能残缺笼罩整个我的项目的工具

原型与演进方向

有一些敌人必定会拿 evosuite 跟 randoop 进去杠我,而事实上这个工程的灵感就源自他们。感兴趣能够看:原型与演进方向

链接

具体介绍与我的项目主页:https://github.com/williamfzc…
接入看这:https://github.com/williamfzc…

正文完
 0