接口测试之TestNG接口自动化实践

发表于:2022-12-30 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:阿里云云栖号

  参数化测试示例
  以 DeviceStatusHSFService 为例,测试类如下:
  public class DeviceStatusHSFServiceTest {
      private DeviceStatusHSFService deviceStatusHSFService;
      @BeforeTest(alwaysRun = true)
      public void beforeTest() {
          String envName = System.getProperty("maven.env");  //运行环境可配置
          SwitchENV switchEnv = new SwitchENV(envName);    //运行环境可配置
          deviceStatusHSFService = HsfRepository.getConsumer(DeviceStatusHSFService.class, switchEnv.getEnv(),
              "HSF", switchEnv.getHsfVersion(), "aicloud-device-center", switchEnv.getTargetIp()).getTarget();
      }
      @Test(dataProvider = "updateDeviceStatus", dataProviderClass = DeviceStatusHSFServiceTestDataProvider.class)
      public void updateDeviceStatusTest(Long userId, String uuid, DeviceStatus deviceStatus){
          Result<Boolean> result = deviceStatusHSFService.updateDeviceStatus(userId, uuid, deviceStatus);
          System.out.println("traceId:"+EagleEye.getTraceId()+result.toString());
          Boolean res = result.getResult();
          assertTrue(res);
      }
  }
  其中通过 SwitchENV 类实现运行环境可配置:
  /**
   * 自定义环境配置
   */
  public class SwitchENV {
      /**
       * 运行环境
       */
      private Env env;
      /**
       * hsf环境
       */
      private String hsfVersion;
      /**
       * 目标机器
       */
      private String targetIp;
      /**
       * 环境名称
       */
      private String envName;
      public SwitchENV(String envName) {
          Properties prop = new Properties();
          // TODO:
          if (envName == null) {
              envName = "pre1";
          }
          switch (envName) {
              case "online": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-online.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.ONLINE;
                  break;
              }
              case "pre1": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre1.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              case "pre2": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre2.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              case "pre3": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre3.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              default:
                  try {
                      throw new Exception("环境变量输入错误!");
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  break;
          }
          hsfVersion = prop.getProperty("hsfVersion").trim();
          targetIp= prop.getProperty("targetIp").trim();
          this.envName = envName;
      }
      public Env getEnv() {
          return env;
      }
      public String getHsfVersion() {
          return hsfVersion;
      }
      public String getTargetIp() {
          return targetIp;
      }
      public String getEnvName() {
          return envName;
      }
  }
  测试参数全部放在DeviceStatusHSFServiceTestDataProvider 类中,实现具体的请求接口、参数、校验等数据做到与代码相隔离。
  /**
   * 自定义环境配置
   */
  public class SwitchENV {
      /**
       * 运行环境
       */
      private Env env;
      /**
       * hsf环境
       */
      private String hsfVersion;
      /**
       * 目标机器
       */
      private String targetIp;
      /**
       * 环境名称
       */
      private String envName;
      public SwitchENV(String envName) {
          Properties prop = new Properties();
          // TODO:
          if (envName == null) {
              envName = "pre1";
          }
          switch (envName) {
              case "online": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-online.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.ONLINE;
                  break;
              }
              case "pre1": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre1.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              case "pre2": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre2.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              case "pre3": {
                  InputStream in = SwitchENV.class.getClassLoader().getResourceAsStream(
                      "config/application-pre3.properties");
                  try {
                      prop.load(in);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  env = Env.PREPARE;
                  break;
              }
              default:
                  try {
                      throw new Exception("环境变量输入错误!");
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  break;
          }
          hsfVersion = prop.getProperty("hsfVersion").trim();
          targetIp= prop.getProperty("targetIp").trim();
          this.envName = envName;
      }
      public Env getEnv() {
          return env;
      }
      public String getHsfVersion() {
          return hsfVersion;
      }
      public String getTargetIp() {
          return targetIp;
      }
      public String getEnvName() {
          return envName;
      }
  }
  思考与总结
  对于接口自动化测试,从用例设计到测试脚本实现,总结起来,需要我们具备如下思想:
  ·模块化思想
  · 数据驱动思想
  · 关键字驱动思想
  模块化思想
  对于我们的接口自动化测试工程而言,需要能够创建小而独立的可以描述的模块、片断以及待测应用程序的脚本。这些树状结构的小脚本组合起来,就能组成能用于特定的测试用例的脚本。
  数据驱动思想
  简而言之,就是测试脚本与测试数据分离。让测试数据独立于测试脚本单独存在,解除脚本与数据之间的强耦合。测试脚本不再负责管理测试数据,而测试数据在数据驱动测试中会以文件或者数据库的形式存在。脚本每次执行会机械的从数据文件或者数据库中读入测试数据,根据测试数据的不同走进不同的测试路径。在整个测试中,测试脚本是一成不变的,它一直机械的执行它本身的代码,而活着的是我们的测试数据集,我们通过不同的数据控制测试脚本中代码的走向。这个思想能够避免测试数据杂糅在测试脚本中,方便测试数据的扩展。再者,在自动化测试中,为了维持回归测试的稳定一致,测试脚本应当尽量避免更改。在非数据驱动的情况下,恰恰违背了这一原则。自动化测试中,随着项目的深入,测试脚本将会持续增多,测试数据和脚本揉在一起?维护起来将会是一件恐怖的事情,出错在所难免,所以这时不要这样做,让数据和脚本分离,坚持死的代码,活的数据,维护的大部分工作将只面向数据。
  关键字驱动思想
  这是一种更为高级的数据驱动测试,核心思想是将测试用例的每个步骤单独封装成一个函数,以这个函数名作为关键字,将函数名及传参写入文件中,每个步骤映射一行文件。通过解析文件的每行内容,将内容拼成一个函数调用,调用封装好的步骤函数,就可以一步步执行测试案例。在一个关键字驱动测试中,待测应用程序的功能和每个测试的执行步骤将被一起写到一个表中。这一个思想通过很少的代码来产生大量的测试用例。同样的代码在用数据表来产生各个测试用例的同时被复用。
  当我们的测试思想越靠近上述三种类型的思想,接口测试的实现将越自动化。随着人工智能的不断发展,AI浪潮下也将诞生更多的自动化测试工具,比如采用人工智能技术,通过某种自适应的算法来迭代我们的测试用例,生成测试脚本。这意味着,未来测试人员的努力方向将在设计出更加可靠、高效的自动化用例生成工具、脚本构建工具与测试执行工具,而原先那些重复劳动的人工测试工作就让聪明的机器帮我们做吧。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号