在他最近发布的测试工具 ZenTest 3.5.0 版本里,Dyan Davis 增加了一个新的方法以应对多案例(Case)测试的情况。他建议的方法是使用矩阵。想像一下在你的应用中要同时测试几个属性(带有直交状态的:可读VS. 不可读……)。基本上你会采取下面四个方法:
def test_edit_user_readable<br></br> <span>some_setup_to_initialize_user_readable_context</span><br></br> <span>some_action_here_edit</span><br></br> <span>some_assertion_error_read</span><br></br>end<p>def test_edit_user_writable</p><br></br> <span>some_setup_to_initialize_user_writable_context</span><br></br> <span>some_action_here_edit</span><br></br> <span>some_assertion_edit</span><br></br>end<p>def test_view_user_readable</p><br></br> <span>some_setup_to_initialize_user_readable_context</span><br></br> <span>some_action_here_view</span><br></br> <span>some_other_assertion_view</span><br></br>end<p>def test_view_user_writable</p><br></br> <span>some_setup_to_initialize_user_writable_context</span><br></br> <span>some_action_here_view</span><br></br> <span>some_other_assertion_view</span><br></br>end
这儿很容易就可以看出其中有些代码能被提取或者分解出来。但是 Ryan 做的更彻底,他把代码组织成一个矩阵,列首代表不同的 Setup 案例,行首代表要做的 Action,交集定义给定的 Action 和 Setup 上下文的期望结果。4 个测试案例(Case)如下面所示:
setups :user_readable,:user_writablematrix:edit,:error_read,:editmatrix:view,:view,:view
ZenTest 通过 **Setup方法保存案例,matrix方法为每一个应用结果创建一个测试方法:def test_#{action}_#{setup}<br></br> matrix_setup_configuration #{setup}.split(//) # global setup<br></br> matrix_setup_#{action} #{setup}, #{expected} # action setup + execution<br></br> matrix_test_#{expected}, #{setup} # expected verification<br></br>end
所以最后,Setup 配置会在一个地方被提取出来,容纳不同案例中的参数。Action 和 Assertion(断言)也被分开。Ryan Davis 给出了一个矩阵化 ** 前后测试案例的可视化例子:
点击图片查看详细代码
测试矩阵模型是 DRY(Don’t Repeat Yourself,不重复自己)流程哲学的又一个示范。这种用法的好处是使非开发人员较容易地理解代码成为可能,而且要增加测试的话,只需要修改矩阵就可以了。
评论