选项处理是 Trade Federation 模块化方法的核心。特别是,选项是开发者、集成者和测试运行程序可以协同工作而无需重复彼此工作的机制。简而言之,我们对选项处理的实现允许开发者将 Java 类成员标记为可配置,此时,该成员的值可以由集成者增强或覆盖,并且可以随后由测试运行程序增强或覆盖。此机制适用于所有 Java 内在类型,以及任何内在类型的 Map
或 Collection
实例。
注意:选项处理机制仅适用于实现 测试生命周期 中包含的接口之一的类,并且仅当该类由生命周期机制实例化时才有效。
开发者
首先,开发者使用 @Option
注解标记成员。他们(至少)指定 name
和 description
值,这些值指定与该选项关联的参数名称,以及当使用 --help
或 --help-all
运行命令时在 TF 控制台上显示的描述。
例如,假设我们要构建一个功能性电话测试,该测试拨打各种电话号码,并期望在每次连接后从每个号码接收一系列 DTMF 音调。
public class PhoneCallFuncTest extends IRemoteTest { @Option(name = "timeout", description = "How long to wait for connection, in millis") private long mWaitTime = 30 * 1000; // 30 seconds @Option(name = "call", description = "Key: Phone number to attempt. " + "Value: DTMF to expect. May be repeated.") private Map<String, String> mCalls = new HashMap<String, String>; public PhoneCallFuncTest() { mCalls.add("123-456-7890", "01134"); // default }
开发者只需设置两个配置点即可完成该测试。然后,他们可以像往常一样使用 mWaitTime
和 mCalls
,而无需过多关注它们是可配置的。因为 @Option
字段是在类实例化之后但在 run
方法调用之前设置的,这为实现者提供了一种简单的方法来为 Map
和 Collection
字段设置默认值或执行某种类型的过滤,否则这些字段将是仅追加的。
集成者
集成者在配置的世界中工作,这些配置以 XML 编写。配置格式允许集成者为任何 @Option
字段设置(或追加)一个值。例如,假设集成者想要定义一个低延迟测试(调用默认号码)以及一个长时间运行的测试(调用各种号码)。他们可以创建一对配置,如下所示:
<?xml version="1.0" encoding="utf-8"?> <configuration description="low-latency default test; low-latency.xml"> <test class="com.example.PhoneCallFuncTest"> <option name="timeout" value="5000" /> </test> </configuration>
<?xml version="1.0" encoding="utf-8"?> <configuration description="call a bunch of numbers; many-numbers.xml"> <test class="com.example.PhoneCallFuncTest"> <option name="call" key="111-111-1111" value="#*#*TEST1*#*#" /> <option name="call" key="222-222-2222" value="#*#*TEST2*#*#" /> <!-- ... --> </test> </configuration>
测试运行器
测试运行器还可以通过 Trade Federation 控制台访问这些配置点。首先也是最重要的是,他们使用 run command <name>
指令(或简写为 run <name>
)运行命令(即配置及其所有参数)。除此之外,他们可以指定任何参数列表作为命令的一部分,这些参数可以替换或追加到每个配置中生命周期对象指定的字段。
要使用 many-numbers
电话号码运行低延迟测试,测试运行器可以执行以下操作
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
或者,要从相反的方向获得类似的效果,测试运行器可以减少 many-numbers
测试的等待时间
tf> run many-numbers.xml --timeout 5000
选项排序
您可能会注意到,call
选项的底层实现是 Map
,因此在命令行上重复使用 --call
时,它们都会被存储。
选项 timeout
的底层实现是 long
,它只能存储一个值。因此,只存储最后指定的值。--timeout 5 --timeout 10
会导致 timeout
包含 10。
如果底层实现是 List
或 Collection
,则所有值都将按照在命令行上指定的顺序存储。
布尔选项
布尔类型的选项可以通过直接传递选项名称设置为 true
,例如,--[选项名称]
,并且可以使用语法 --no-[选项名称]
设置为 false
。