• 14
  • 14
分享
  • 【译】如何写一手漂亮的测试代码
  • Tynam 2021-02-07 14:44:37 字数 2697 阅读 1910 收藏 14

在编写 Junit 测试时,我采用了同一套格式。如此,对于测试用例我就可以遵循这套格式进行编写和阅读,使所有的测试都整体划一。这种格式模板可以帮助我更快的编写测试,提高工作效率。今天我就与大家分享我的这套格式模板。

(译者评:与我在测试建设原则中提出的继承原则相同,都是在进行一项测试工作之前,将公共的进行提取,统一格式模板,然后在以后的测试活动中都继承这套模板开展。)

文件格式

首先,在项目的测试包下新建一个测试文件/测试类,并且创建测试方法。在编写测试文件/测试类时,所有的测试文件/测试类都以 Test 结束,这样会容易理解其是一个测试文件/测试类,也方便后期维护时查看,编辑。例如一个名字为 SomeService 的类就会有一个名为 SomeServiceTest 对应的测试类。

(译者评:这是一个很好的习惯,在项目测试中可以考虑作为一种规定。就是开发在程序中写了一个 SomeService 类,那么在测试 SomeService 类时文件名就需要是 SomeServiceTest,以 类名 + Test 的形式进行命名测试类。)

然后,给测试取一个容易识别,区分,好听的名字,笔者个人比较喜欢省略单词 test,因为就是在测试类中进行的,继续在名字中添加 test 看起来就有点累赘。对于测试名字需要从名字中读取出所测的内容,这样我们就可以更好的对每一个测试进行区分。

public SomeServiceTest{
   @Test
   public void sortByPopularVoteDesc() {

   }
   @Test
   public void sortByPopularVoteAsc() {

   }}

(译者评:对于测试名,取一个易于理解的还是比较支持的,见名知意。但对于省略单词 test,译者理解的是一般情况下可以省略,但是某些必要的场景还是希望添加。)

大纲

接下来,笔者会在测试方法中写入一些模板,这种模板是我在写所有测试中都会使用的模板。首先在测试方法中设置了一个预置条件 setup,然后对方法进行测试 test,最后进行断言 assert/validate,通过断言来确保与期望结果一致。

public TestClass{
   @Test
   public void sortByPopularVote() {
     // setup     
      // test      
      // assert/validate    }}

上面代码中部分内容的含义:

  • setup: 测试预制条件写的地方。

  • test: 对方法进行测试地方。

  • assert/validate: 此处写断言。

(译者评:作者在此写的并不是很全。有准备条件,但是没有销毁条件。我们都知道,在进行自动化测试时非常重要的一个步骤就是数据复原。如果测试后数据没有复原,将会影响一次的执行。所以在上面三个过程后,还应该存在一个销毁条件 teardown,虽然可能 teardown 不是一个必须项。所以一共应该有四个步骤,setup、test、assert/validate、teardown。)

(译者评:上面写的范围有点小。不仅在测试类中需要有这样的设置,在测试类层面、测试文件层面也需要 setup、test、assert/validate、teardown 四个步骤。)

预制条件

最后,我简单的填充了一下空白。如果预置条件和所有其他测试的预制条件相似,笔者会将此逻辑抽象为 @Before 函数。每个测试之前都会执行此函数。如果多个测试,但不是所有测试,之间需要设置一个预制条件,那么就将其设置为一个私有函数进行封装。对于一般的测试,使用这两种方法设置预制条件都可以提高代码的复用性。如果需要改变测试的预制条件,那么只需要对一个地方进行改变便可以达到目的。在进行测试重构时这将是非常实用的。

public TestClass{
 private List<SortableObj> expected;
 private final SortableObj first = new SortableObj();
 private final SortableObj second = new SortableObj();
 private final SortableObj third = new SortableObj();
 private final SortableObj fourth = new SortableObj();

  @Before
  public void before{
    // some decoration on objects     
    // ...     expected = Arrays.asList(first, second, third, fourth);
  }

   @Test
   public void sortByPopularVote() {
     // setup      List<SortableObj> actual = Arrays.asList(fourth, third, first, second);
     // test      Collections.sort(actual);
     // assert/validate      assertThat(actual).isEqualTo(expected);
   }}

测试命名

在进行预期结果和实际结果命名时,使用 expected 和 actual 是非常有效的。 使用这两个关键字写断言也非常易于阅读。actual 是实际结果,expected 是预期结果,使用这两个结果进行对比。

  • expected :这是预期结果,即是希望的结果是什么。预期结果可能有多条,在写的时候请按照一定的顺序进行。

  • actual :测试执行后,实际输出的结果。 命名是对一个事物进行设计或选择的名字,特别是在科学或其他学科中。在软件开发和测试中,涉及到 API、响应结果、变量、函数、文档名称。 

(译者评:四个字,见名知意。)


结论

使用这个格式模板进行测试,可以提高测试效率,使代码更易维护。

(译者评:全文所说的文件格式、测试顺序、断言命名、预期结果排序还是值的学习的,特别对于没有经历过痛苦的维护代码的人员来说非常又必要。就是内容太少,总结的太少。)



原文:https://dev.to/ninan_phillip/how-to-write-great-tests-4719


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • PO模式:Page Object,PO模式是自动化测试项目开发实践的最佳设计模式之一。核心思想:通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素位置发生变化,只需要调整页面封装的代码,提高测试用例的可维护性、可读性。优点: 减少了冗余代码业务代码和测试代码被分开,降低耦合性维护成本低缺点:结构复杂:基于流程做了模块化的拆分案例一:自动发送短信方法:Appium+PO模式+Pytest框架数据参数化模块分布base模块:前置代码和基本操作,base_driver.py对应打开driver,base_action.py对应元素定位、点击按钮和输入。page模块:对应操作页面,考...
            0 0 1112
            分享
          •   当地时间 6 月 11 日,埃隆?马斯克在加州法院撤回了针对 OpenAI 以及该公司两位联合创始人萨姆?阿尔特曼 (Sam Altman) 和格雷格?布罗克曼 (Greg Brockman) 的诉讼。此前他指控该公司违反合同,并声称其放弃了造福人类的初衷。据 CNBC 报道,该案已无条件撤销。  马斯克撤诉的决定距离法官原定审理 OpenAI 驳回诉讼请求的听证会仅有一天。此前一天,马斯克还公开批评了 OpenAI 及其与苹果的新合作关系,称如果苹果公司将 OpenAI 的技术集成到 iPhone 和 Mac 的“操作系统层面”,他将禁止其公司使用苹果设备,并做出了其他一些威胁。  他的...
            0 0 508
            分享
          •   如果能够掌握web自动化及接口自动化的话,在北京、深圳、上海这种城市拿到10K以上的薪水应该不是大问题,掌握的好的话,能拿到13、4K也正常。  如果实只是会用,没有足够的项目经验的话,薪资会大大打折,拿到10K就不错啦。  如果你是在西安、济南、成都这些城市,好的话能上12k,差点的话在9K左右。  在没有自动化项目经验的情况下,找工作一定要擦亮眼睛,因为现在很多企业虽然名义上在招聘自动化测试工程师,但是实际上大部分还在做手工测试,如果你学的东西不能很好的实践,很快就会忘记,那就又回到解放前啦。  个人建议,要找就找全自动化的岗位,就算开始薪资低一点也没事,先做一年,等技术成熟了再换一家...
            0 0 992
            分享
          •   据报道,针对美国政府起诉微软690亿美元收购动视暴雪交易,法官将于1月3日举行首次审前听证会。  去年1月,微软宣布将以每股95美元的现金,收购游戏开发和互动娱乐内容发行商动视暴雪,交易总金额约为690亿美元。交易完成后,微软将成为世界上营收第三高的游戏公司,仅次于腾讯和索尼。  上个月,负责反垄断执法的美国联邦贸易委员会(FTC)要求法官阻止这笔交易,理由是交易将使微软的Xbox游戏平台获得动视暴的独家内容,从而导致竞争对手任天堂和索尼的游戏平台被冷落。  而微软则反驳称,这笔交易将使游戏玩家和其他游戏公司从中受益。同时,微软还承诺,至少在10年内继续向索尼等竞争对手提供《使命召唤》游戏...
            0 0 998
            分享
          • 作者:IDO老徐 每天收到的问题无数,梳理分析后,无外乎如下几类 。 1. 如何找到一份靠谱的工作 ? 2. 遇到职业迷茫了,如何抉择 ? 3. 目前xx现状,打算入行(或转行)测试,是否适合 ? 4. 遇到具体的xx技术障碍了,不知道怎么解决(找答案) 。 等等 。 今天, 聊聊《如何找到一份靠谱工作 ?》 1. 从现在开始(看完此文后),确定自己的职业发展方向 推荐一文, 之前写的测试从业者18条可行性路径, ...
            2 1 3483
            分享
      • 51testing软件测试圈微信