从MeterSphere的设计思路来看,它并没有引入系统来作为测试用例的一个容器,而是使用了测试项目来代表一个大的用例集合。用户可以在某个项目中选择一批用例组成一个测试计划,并分配个测试人员执行测试。作为整个旅程的第一项任务,是在登录之后新创建一个测试项目,为后续其它业务操作提供上下文。
首先观察一下controller源码。
package io.metersphere.controller;
@RestController
@RequestMapping(value = "/project")
public class ProjectController {
@PostMapping("/add")
@RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER,}, logical = Logical.OR)
public Project addProject(@RequestBody Project project) {
return projectService.addProject(project);
}
}
可以了解到新增项目这个接口
根据上述分析,编写一个简单的新增测试项目的测试用例。
@Test
public void testAddProject() throws Exception {
Project project=new Project();
project.setName("IamName");
String projectAdd= doPost("/project/add",JSON.toJSONString(project));
//将相应的数据转换为字符串
ResultHolder resultHolder= JSON.parseObject(projectAdd,ResultHolder.class);
// assertThat(resultHolder.isSuccess()).isTrue();
Project proj= JSON.parseObject(String.valueOf(resultHolder.getData()),Project.class);
assertThat(proj.getName()).isEqualTo(project.getName());
}
Project这个实体有着诸多的属性,不过在创建测试项目时,仅仅提供测试项目名称即可通过系统校验创建成功。因此,在用例中做了简化处理。另外,在接口返回的data中是经过序列化以后的Project实例。笔者此处用name的一致性做断言。在创建过程中,系统会自动分配一个id给到这个新增的项目上,也可以额外判断id非空来断言。
一般来说,在进行系统功能的分解和测试用例的组织时,常见的就是所谓系统-模块-功能点的树形结构划分。MeterSphere也在“项目”中引入了“模块”的概念。如果说一个项目的用例集是一棵树的话,那么模块就是这棵树的枝条,而用例就是最末端的树叶子了。以下是该项目demo网站上的一个模块截图。可以看到,通过模块-子模块这样的一层层嵌套,形成了一个测试用用例集的树形结构。
在简单了解了模块的含义和功能后,就来到了本小节的第二个案例,在之前新建的测试项目中新建一个测试模块,用于下挂测试用例。
做过接口自动化测试的读者可能都使用过Chrome浏览器的开发者工具。在打开该工具,并在前台新建测试模块后,通过该工具可以查看到这个过程中的http请求与响应。如以下是请求的部分。
通过这个过程,我们了解到这个接口的url是 "/case/node/add",由此可以通过查找定位这个接口对应的服务端代码。
package io.metersphere.track.controller;
@RequestMapping("/case/node")
@RestController
@RequiresRoles(value = {RoleConstants.ADMIN, RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER, RoleConstants.TEST_VIEWER, RoleConstants.ORG_ADMIN}, logical = Logical.OR)
public class TestCaseNodeController {
@PostMapping("/add")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
public String addNode(@RequestBody TestCaseNode node) {
return testCaseNodeService.addNode(node);
}
}
这样,就可以开始编写基于MockMVC的新建模块的用例了。
@Order(2)
@Test
@DisplayName("02模块-在新项目中创建模块")
public void testAddModuleInProject() throws Exception {
String name="node-"+getRandom();
testCaseNode.setProjectId(project.getId());
testCaseNode.setName(name);
testCaseNode.setLevel(1);
String projectAdd= doPost("/case/node/add",JSON.toJSONString(testCaseNode));
ResultHolder resultHolder= JSON.parseObject(projectAdd,ResultHolder.class);
String id=String.valueOf(resultHolder.getData());
testCaseNode.setId(id);
assertThat(testCaseNode.getId()).isNotNull();
}
如前所述,测试模块的实质是测试项目这棵树下的非叶子节点,因此在创建时除了指定名字之外,还需要指定ProjectId。另外,如果不是根目录下的模块,而是子模块的话,还需要额外指定父模块,即:
testCaseNode.setParentId
这个接口的返回值是新增的这个测试模块的id号。返回整个对象或者只是id,这些都是一个比较友好的设计。接口的调用者可以凭此来判断断言是否成功。本用例中简单地断言了testCaseNode为非空,隐含意思是新建成功。
完成了项目和模块的新建之后,就完成了本次旅程的第一步。后续就可以创建测试用例,并启动测试计划和评审流程了。