技术解析
在持续交付越来越流行的今天,单测作为保障 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.r国外服务器unners.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 {
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)