矩阵化你的 Rails 功能测试

阅读数:148 2007 年 4 月 23 日

话题:Ruby测试语言 & 开发架构

在他最近发布的测试工具ZenTest 3.5.0版本里,Dyan Davis 增加了一个新的方法以应对多案例(Case)测试的情况。他建议的方法是使用矩阵。想像一下在你的应用中要同时测试几个属性(带有直交状态的:可读 VS. 不可读……)。基本上你会采取下面四个方法:

def test_edit_user_readable

    some_setup_to_initialize_user_readable_context

    some_action_here_edit

    some_assertion_error_read

end

def test_edit_user_writable



    some_setup_to_initialize_user_writable_context

    some_action_here_edit

    some_assertion_edit

end

def test_view_user_readable



    some_setup_to_initialize_user_readable_context

    some_action_here_view

    some_other_assertion_view

end

def test_view_user_writable



    some_setup_to_initialize_user_writable_context

    some_action_here_view

    some_other_assertion_view

end

这儿很容易就可以看出其中有些代码能被提取或者分解出来。但是 Ryan 做的更彻底,他把代码组织成一个矩阵,列首代表不同的 Setup 案例,行首代表要做的 Action,交集定义给定的 Action 和 Setup 上下文的期望结果。4 个测试案例(Case)如下面所示:



setups :user_readable,:user_writable
matrix:edit,:error_read,:edit
matrix:view,:view,:view


ZenTest 通过Setup方法保存案例,matrix方法为每一个应用结果创建一个测试方法:

def test_#{action}_#{setup}

    matrix_setup_configuration #{setup}.split(//) # global setup

    matrix_setup_#{action} #{setup}, #{expected} # action setup + execution

    matrix_test_#{expected}, #{setup} # expected verification

end



所以最后,Setup 配置会在一个地方被提取出来,容纳不同案例中的参数。Action 和 Assertion(断言)也被分开。

Ryan Davis 给出了一个矩阵化前后测试案例的可视化例子:

点击图片查看详细代码

测试矩阵模型是 DRY(Don't Repeat Yourself,不重复自己)流程哲学的又一个示范。这种用法的好处是使非开发人员较容易地理解代码成为可能,而且要增加测试的话,只需要修改矩阵就可以了。