专栏首页软件测试那些事我来给MeterSphere写测试用例03

我来给MeterSphere写测试用例03

测试项目新建

从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);
    }
}

可以了解到新增项目这个接口

  • 访问URL是:/project/add @RequestMapping(value = "/project")表示整个ProjectController 类的访问路径是"/project" @PostMapping("/add")表示新增项目这个接口的访问路径是"add", 接口类型是Post。 合并起来,这个接口的完整URL就是"/project/add"
  • 接口类型:POST 这个在URL时已经介绍过了
  • 接口入参:接受Project类的实例作为入参 在接口定义的入参中通过@RequestBody注解进行标注。
  • 接口返回值:Project类的实例 当然这里看到的只是controller类里某个方法的返回值。MeterSphere还在切面中提供了统一格式的HTTP接口返回格式,感兴趣的读者可以参考ResultHolder。controller方法中返回的Project类实例将作为data字段的属性值。
  • 权限:测试经理和测试用户 通过Shiro提供的@RequiresRoles注解来实现

测试用例编写

根据上述分析,编写一个简单的新增测试项目的测试用例。

    @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为非空,隐含意思是新建成功。

完成了项目和模块的新建之后,就完成了本次旅程的第一步。后续就可以创建测试用例,并启动测试计划和评审流程了。

本文分享自微信公众号 - 软件测试那些事(antony-not-available),作者:风月同天测试人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 部分mock

    在测试过程中,有个类的部分方法可能需要实际调用,而某些方法则是被mock的,也就是部分mock的场景。在Mockito中,可以使用Spy来实现。首先来看一个最简...

    Antony
  • 单测实例-void方法验证

    以下是被测对象updateProject(Project project),以及经过测试之后的代码覆盖情况。

    Antony
  • 门面出租-测试工具中的设计模式实例谈之门面模式

    本文将以TestLinkAPI为案例,介绍门面模式(Facader Pattern)以及在TestLinkAPI中利用此模式提供统一对外服务接口,提高用户使用便...

    Antony
  • python 基础 切片 迭代 列表生成式

    对list 进行切片   如列表     L = ['Adam', 'Lisa', 'Bart', 'Paul']     L[0:3]     ['Adam'...

    用户1197315
  • Flink Forward 2019--Flink相关(2)--如何join两个流

    How to Join Two Data Streams--Piotr Nowojski(Ververica)

    阿泽
  • scrollLeft等属性介绍

    HTML5学堂:在平日中书写滚动类特效时,为了提升代码的扩展性,通常会使用变量替换掉常量,此时会经常用到scrollLeft、offsetWidth、clien...

    HTML5学堂
  • Automagica小试

    Automagica 是一个开源智能机器人流程自动化(SRPA,Smart Robotic Process Automation)平台,借助 Automagic...

    py3study
  • 一分钟理解什么是REST和RESTful

    转载自:http://baijiahao.baidu.com/s?id=1591007540303121112&wfr=spider&for=pc

    matinal
  • OpenDaylight融合OpenStack架构分析

    OpenStack和OpenDaylight(ODL)的融合是一个热门话题,有大量的文档可供参考,但是这些文章主要对其使用方面进行阐述,而没有讲如何实现Open...

    SDNLAB
  • 如何将微信地区设置为:日本 我孙子市

    先说一个有意思的:微信地区有个很特别的现象,很多地区都是“安道尔”,可以做一个有趣的计算,根据自己好友中安道尔人数占总好友的比例,去乘以使用微信软件总用户的数量...

    许坏

扫码关注云+社区

领取腾讯云代金券