RoR cucumber 和 capybara 可以直接测试数据库记录吗?
Could RoR cucumber and capybara to test db record directly?
我理解 cucumber
和 capybara
是模仿用户操作来测试网络应用程序。但是,如果某些属性无法直接从Web界面找到,我是否可以或建议直接获取数据库记录进行测试?
如果是,如何定位当前测试用例创建的db记录?
不建议,但可以在功能测试中进行直接数据库访问测试。这样做的主要原因是功能测试旨在成为黑盒测试,从用户体验的角度测试应用程序中的特定功能(用户无法查看数据库,无论如何也不应该)。在那种情况下,即使对象的某些属性的值在 UI 中在技术上不可见,但该属性在显示时必须对记录产生一些影响(否则为什么首先要有该属性),并且该效果应该可以通过 UI 进行测试。
在极少数情况下,您确实需要直接访问数据库,您需要记住,您需要控制 UI 和测试数据库之间的同步。例如,以下测试代码最多会导致不稳定的测试。
...
click_button('Do something')
expect(MyObject.last.some_attribute).to be true
...
这是因为一旦按钮被点击,Capybara 就不知道点击会产生任何进一步的动作,而只是 returns。然后在处理按钮单击生成的请求之前发生数据库访问,并且还没有记录,您正在测试错误的记录,或者记录的状态尚未更新并且测试失败。要解决此问题,您需要在点击和数据库检查之间插入一个期望值,以等待触发的操作完成
...
click_button('Do something')
expect(page).to have_content('Something has been done') # UI check that will succeed when the triggered action has completed
expect(MyObject.last.some_attribute).to be true
...
至于如何识别你想要的DB记录,你控制所有的测试数据,每次测试都要重新设置。这样,如果您刚刚创建了一条记录,那么它应该是最后一条记录 (MyObject.last
)。如果您正在编辑记录,那么您在测试设置中创建了初始记录并且应该可以访问它 (my_test_object.reload...
),等等...
我理解 cucumber
和 capybara
是模仿用户操作来测试网络应用程序。但是,如果某些属性无法直接从Web界面找到,我是否可以或建议直接获取数据库记录进行测试?
如果是,如何定位当前测试用例创建的db记录?
不建议,但可以在功能测试中进行直接数据库访问测试。这样做的主要原因是功能测试旨在成为黑盒测试,从用户体验的角度测试应用程序中的特定功能(用户无法查看数据库,无论如何也不应该)。在那种情况下,即使对象的某些属性的值在 UI 中在技术上不可见,但该属性在显示时必须对记录产生一些影响(否则为什么首先要有该属性),并且该效果应该可以通过 UI 进行测试。
在极少数情况下,您确实需要直接访问数据库,您需要记住,您需要控制 UI 和测试数据库之间的同步。例如,以下测试代码最多会导致不稳定的测试。
...
click_button('Do something')
expect(MyObject.last.some_attribute).to be true
...
这是因为一旦按钮被点击,Capybara 就不知道点击会产生任何进一步的动作,而只是 returns。然后在处理按钮单击生成的请求之前发生数据库访问,并且还没有记录,您正在测试错误的记录,或者记录的状态尚未更新并且测试失败。要解决此问题,您需要在点击和数据库检查之间插入一个期望值,以等待触发的操作完成
...
click_button('Do something')
expect(page).to have_content('Something has been done') # UI check that will succeed when the triggered action has completed
expect(MyObject.last.some_attribute).to be true
...
至于如何识别你想要的DB记录,你控制所有的测试数据,每次测试都要重新设置。这样,如果您刚刚创建了一条记录,那么它应该是最后一条记录 (MyObject.last
)。如果您正在编辑记录,那么您在测试设置中创建了初始记录并且应该可以访问它 (my_test_object.reload...
),等等...