,这是一个普遍现 象,也已经有很多方法来加速测试的运行速度。但很多需要新工具的支持,而项 目组暂时没时间去切换工具。有没有其它更方便的做法?
像其它性能问题一样,我们首先需要确定瓶颈在哪里。我们发现主要是每个 测试用例运行前搭建测试所需的环境相对较为耗时,尤其是Selenium测试,它需 要启动和关闭浏览器。并且,很多测试用例其实使用相同的环境设置,只是每个 用例仅仅去断言其中一个需求。
我们可以修改Runner,让一组测试使用同一个浏览器实例,每次环境的清理 通过清理Session来完成。而我们也可以采取另外一种方法,就是合并使用相同 环境设置的测试用例,把它们的断言都放进同一个用例。
哦,这又违反了Kent Beck 为TDD制定的原则:每个测试用例最好只有一个断 言。
好,让我们再一次分析原则背后的理念。一个用例一个断言,是为了让测试 更清晰,更精确的描述需求,测试失败更容易定位。那么有没有一种方法,既能 让多个断言共享相同的环境设置,又能清晰精确的描述需求呢?
想想,我们用什么来描述需求?是测试用例的名称,确切的说,是函数的名称 。只要我们把一组组相关的断言封装到一个个函数里,给它们一个能够清晰精确 的描述这组断言对应的需求的名称,然后在测试用例里面调用这些函数就可以了 。这样我们只需为多个断言设置一次环境,而同时又保留了清晰精确的表达需求 的能力。
@Test
public void test_should_show_step_details_info_in_todo_item_page() throws Exception {
TodoItemPage page = navigator.gotoTodoItemPage( );
should_show_step_name_as_page_title (activeStepOfNonStartedInstance, page);
should_show_start_processing_button_if_current_step_status_is_waiting (page);
should_show_transition_buttons (activeStepOfNonStartedInstance, page);
should_NOT_ask_user_to_input_his_opinion_if_current_step_status_is_NOT _processing(page);
should_show_comment_box_after_click_start_process (page);
}
private void should_show_step_name_as_page_title(FlowStep step, TodoItemPage page) {
assertEquals(step.getName(), page.title());
}
private void should_show_start_processing_button_if_current_step_status_is_waiting (TodoItemPage page) {
assertTrue(page.isStartProcessingButtonVisible());
}
private void should_show_comment_box_after_click_start_process (TodoItemPage page) {
page。clickStartProcessingButton();
assertTrue(page.isCommentBoxAppear());
}
private void should_ask_user_to_input_his_opinion_if_current_step_status_is_process ing(TodoItemPage page) {
assertTrue(page.isCommentBoxVisible());
assertTrue(page.isActionButtonsVisible());
}
private void should_ask_user_to_select_next_step_operators (FlowTransitionDefinition nextTransitonOfStep,
TodoItemPage page) {
assertTrue(page。isUserGroupVisible (nextTransitonOfStep.getId()));
}
……
小结
回过头来我们看看上面的三个实践,它们如出一辙的,一次又一次的"违反" 了某种原则。它们分别是"不能用汉语","不能一次编写多个测试用例",和"不 能在一个用例里面使用多组断言",而实际上,我们违反的只是这些原则的外在 形 |