testable-mock/docs/zh-cn/doc/javaagent-args.md
2021-06-01 10:58:00 +08:00

5.2 KiB
Raw Blame History

全局运行参数

TestableMock的许多功能采用了基于JavaAgent的运行时字节码修改实现。在JavaAgent启动时可以通过全局配置文件调整其执行过程。

1.使用全局配置文件

在项目的src/test/resources目录下创建一个名为testable.properties的文本文件,其中每行是一条配置项,配置项的名称与值之间用=连接。

详细的可用配置项列说明下:

配置项 描述 可用值和示例
dump.path 将修改过后的字节码保存到本地指定目录(用于排查问题) 相对项目根目录的位置,例如:target/bytecode
enhance.pkgPrefix.includes TestableMock仅在特定包内生效,通常用于大型项目 使用,分隔的包路径前缀列表,例如:com.demo.biz,com.3rd.biz
log.file 指定TestableAgent日志文件位置 相对项目根目录的位置,例如:target/testable/agent.log,特殊值null表示禁用日志文件
log.level 修改全局日志级别 可用值为:mute(禁止打印警告) / debug(打印调试信息) / verbose(打印非常详细的调试信息)
mock.innerClass.name 修改测试类中的内置Mock容器类名 任意符合Java类名的值默认值为Mock
mock.scope.default 修改默认的Mock生效范围详见Mock生效范围 可用值为:global(全局生效) / associated(只对关联的测试用例生效)
mock.target.checking.enable 是否启用Mock目标有效性的前置检查 可用值为:true / false,当前默认值为false
omni.constructor.enhance.enable 是否启用OmniConstructor的字节码增强模式 可用值为:true / false
omni.constructor.enhance.pkgPrefix.excludes 对特定包禁用OmniConstructor的字节码增强模式 使用,分隔的包路径前缀列表,例如:com.demo.model
thread.pool.enhance.enable 是否启用基于TransmittableThreadLocal的Mock上下文存储 可用值为:true / false

参见demo目录各示例项目中的testable.properties文件。

2.修改配置文件位置

除了配置文件,TestableMock也支持通过引入testable-agent包时,在末尾加上一个=符号,然后连接额外参数来实现全局配置。这种方法与使用配置文件基本等效,因此通常无需使用,但有唯一特例是configFile配置项,该配置项可用于修改全局配置文件的位置。

参数 描述 可用值和示例
configFile 修改全局配置文件位置 可用相对路径或绝对路径,当为相对路径时,表示相对项目根目录的位置,默认值为src/test/resources/testable.properties

对于Maven项目可将参数追加到maven-surefire-plugin参数testable-agent包尾部,紧接着.jar的位置。例如将配置文件位置修改为项目根路径下的config/testable.properties文件:

<configuration>
    <argLine>-javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar=configFile=config/testable.properties</argLine>
</configuration>

对于Gradle项目同样是直接将参数追加到引入testable-agent的配置末尾。例如:

    jvmArgs "-javaagent:${classpath.find { it.name.contains("testable-agent") }.absolutePath}=configFile=config/testable.properties"

3. 全局配置技巧

对于一般的小型项目,TestableMock的所有功能都是开箱即用的,正确引用依赖包后,无需进行额外配置。

默认情况下,TestableMock会在构建目录中Maven构建的target目录或Gradle构建的build目录)自动生成一个记录执行过程的testable-agent.log文件。若希望禁用此日志文件,可将log.file参数赋值为null

若测试中使用了OmniConstructor且遇到构造出错的情况,可开启omni.constructor.enhance.enable配置倘若开启后依然报错请提Issue告诉我们omni.constructor.enhance.pkgPrefix.excludes配置主要用于当开启OmniConstructor字节码增强模式报错时,临时绕过某些无法处理的类型,通常无需使用。

若项目较大构建生成的jar包大于100MB可考虑使用enhance.pkgPrefix.includes参数来减少TestableMock在测试启动前建立Mock关联和进行OmniConstructor预处理的扫描时长,从而加快单元测试启动速度。通常将值设置为当前项目自身的<group>.<artifact>路径即可如需Mock三方包中的调用或通过OmniConstructor构造来自三方包中的类型,则还应该加上相应的三方包路径。

若项目测试中既包含真实的单元测试又包含了使用单元测试框架编写的集成测试时。为了让集成测试的执行过程不受Mock影响可能需要使用mock.scope.default将默认的Mock方法范围限制为仅对所属类型的单元测试用例生效。

若需Mock的调用发生在线程池中且遇到verify()结果或MOCK_CONTEXT内容不正确的时候,则需考虑开启thread.pool.enhance.enable配置,详见Mock线程池内的调用