一个适用于 android/jvm 的冒烟单测生成器 randunit

2021-03-31 10:30:35 +08:00
 williamfzc

背景

在持续交付越来越流行的今天,单测作为保障 CI 质量的重要一环也开始在国内被重视起来。

不过在单测上大家的态度还是比较矛盾的,担心的事情主要有两个:

但是缺少这一环,在整个 devops 流程中很多编译时严重问题会被延缓到运行时暴露,这对于项目效率阻碍也不小。。

于是就有了灵感来源:

做了什么

RandUnit 取义自 Random UnitTest,他会:

而这一切只需要一次简单的复制粘贴:

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
        @Parameterized.Parameters(name = "{0}")
        fun data(): Collection<StatementModel> {
            return cases
        }
    }

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

由于它是合法的 junit 用例,所以你可以在 ide 里直接运行它。直接 run with coverage 的话:

可以看到,它帮你生成了 500+条用例并执行了。

解决了啥

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

像这种问题:

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)

链接

848 次点击
所在节点    程序员
1 条回复
hantsy
2021-03-31 22:51:58 +08:00
这个不错,和国内满大街的 UI 换肤开源项目比,这算是真正有点价值的开源项目。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX