更改目标是更改 DUT 和 Tester 实例的机制,因此从根本上说,在您的第一个示例中完成的方式是正确的。
我认为您目前可以即时实例化一个新的测试器,但这并不是真正的设计,也不是我想要鼓励的模式。事实上,我们最近有一个类似的错误案例,因为目标/环境组合正在实例化两个不同的测试人员。因此,将来我希望看到实例化第二个测试仪会引发错误,就像您今天尝试实例化第二个 DUT 对象时一样。顺便说一句,这不仅仅是品味问题,注册/取消注册当前运行时以侦听回调和类似的事情涉及到相当多的工作,如果我们限制,则更容易管理和推理DUT 和测试仪可以更改到目标负载事件内的时间。
我认为Configurable Targets大致就是你想要的,从 API 的角度来看,这看起来很干净:
# target/my_test_target.rb
options[:tester].new
MyDUT.new
然后在您的测试代码中:
Origen.load_target('my_test_target', tester: OrigenTesters::V93K)
tester.v93k? # => true
tester.j750? # => false
Origen.load_target('my_test_target', tester: OrigenTesters::J750)
tester.v93k? # => false
tester.j750? # => true
但是这里有一个弱点:像这样以编程方式操作目标的 API 并没有真正跟上这样一个事实,即一个约定已经演变为在环境中加载测试器,在目标中加载 DUT。
我们肯定希望继续强制加载目标或环境将始终意味着两者都被加载。但是,我们可能也应该引入可配置环境的概念:
# environment/configurable.rb
options[:tester].new
然后在您的测试代码中:
# Calling this would re-load the current target as well
Origen.load_environment('configurable', tester: OrigenTesters::V93K)
tester.v93k? # => true
tester.j750? # => false
Origen.load_environment('configurable', tester: OrigenTesters::J750)
tester.v93k? # => false
tester.j750? # => true
但是,在撰写本文时,该 API 尚不受支持。