当前位置: 首页 > 知识库问答 >
问题:

实体Java单元测试自动化?(JUnit/Hamcrest/…)

斜淳
2023-03-14

我正在寻找以下内容:

  • 坚实的单元测试方法
    1. 我的方法缺少了什么?
    2. 我做错了什么?
    3. 我在做什么是不必要的?
    null
    null
    null
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Arrays;
import com.google.common.collect.ImmutableList;
public class MyPath {
  public static final MyPath ROOT = MyPath.ofComponents("ROOT");
  public static final String SEPARATOR = "/";
  public static MyPath ofComponents(String... components) {
    checkNotNull(components);
    checkArgument(components.length > 0);
    checkArgument(!Arrays.asList(components).contains(""));
    return new MyPath(components);
  }
  private final ImmutableList<String> components;
  private MyPath(String[] components) {
    this.components = ImmutableList.copyOf(components);
  }
  public ImmutableList<String> getComponents() {
    return components;
  }
  @Override
  public String toString() {
    StringBuilder stringBuilder = new StringBuilder();
    for (String pathComponent : components) {
      stringBuilder.append("/" + pathComponent);
    }
    return stringBuilder.toString();
  }
}
import static org.hamcrest.Matchers.is;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import com.google.common.base.Joiner;
@RunWith(Enclosed.class)
public class MyPathTests {
  public static class GetComponents {
    @Test
    public void componentsCorrespondToFactoryArguments() {
      String[] components = { "Test1", "Test2", "Test3" };
      MyPath myPath = MyPath.ofComponents(components);
      assertThat(myPath.getComponents(), contains(components));
    }
  }
  public static class OfComponents {
    @Test
    public void acceptsArrayOfComponents() {
      MyPath.ofComponents("Test1", "Test2", "Test3");
    }
    @Test
    public void acceptsSingleComponent() {
      MyPath.ofComponents("Test1");
    }
    @Test(expected = IllegalArgumentException.class)
    public void emptyStringVarArgsThrows() {
      MyPath.ofComponents(new String[] { });
    }
    @Test(expected = NullPointerException.class)
    public void nullStringVarArgsThrows() {
      MyPath.ofComponents((String[]) null);
    }
    @Test(expected = IllegalArgumentException.class)
    public void rejectsInterspersedEmptyComponents() {
      MyPath.ofComponents("Test1", "", "Test2");
    }
    @Test(expected = IllegalArgumentException.class)
    public void rejectsSingleEmptyComponent() {
      MyPath.ofComponents("");
    }
    @Test
    public void returnsNotNullValue() {
      assertThat(MyPath.ofComponents("Test"), is(notNullValue()));
    }
  }
  public static class Root {
    @Test
    public void hasComponents() {
      assertThat(MyPath.ROOT.getComponents(), is(not(empty())));
    }
    @Test
    public void hasExactlyOneComponent() {
      assertThat(MyPath.ROOT.getComponents(), hasSize(1));
    }
    @Test
    public void hasExactlyOneInboxComponent() {
      assertThat(MyPath.ROOT.getComponents(), contains("ROOT"));
    }
    @Test
    public void isNotNull() {
      assertThat(MyPath.ROOT, is(notNullValue()));
    }
    @Test
    public void toStringIsSlashSeparatedAbsolutePathToInbox() {
      assertThat(MyPath.ROOT.toString(), is(equalTo("/ROOT")));
    }
  }
  public static class ToString {
    @Test
    public void toStringIsSlashSeparatedPathOfComponents() {
      String[] components = { "Test1", "Test2", "Test3" };
      String expectedPath =
          MyPath.SEPARATOR + Joiner.on(MyPath.SEPARATOR).join(components);
      assertThat(MyPath.ofComponents(components).toString(),
          is(equalTo(expectedPath)));
    }
  }
  @Test
  public void testPathCreationFromComponents() {
    String[] pathComponentArguments = new String[] { "One", "Two", "Three" };
    MyPath myPath = MyPath.ofComponents(pathComponentArguments);
    assertThat(myPath.getComponents(), contains(pathComponentArguments));
  }
}

>

  • 是否有用于构建单元测试的技术列表?一些比我上面过于简化的列表更高级的东西(例如检查空值、检查边界、检查预期异常等)也许可以在一本书中购买或一个URL中访问?

    一旦我有了一个接受某种类型参数的方法,我可以得到任何Eclipse插件来为我的测试生成存根吗?也许使用Java注释来指定关于方法的元数据,并让工具为我实现相关的检查?(例如@mustbelowercase,@shouldbeofsize(n=3),...)

    我发现必须记住所有这些“QA技巧”和/或应用它们是乏味的,像机器人一样,我发现复制和粘贴容易出错,我发现当我像上面那样编写代码时,它不是自我文档化的。诚然,Hamcrest库朝着专门化测试类型的总体方向前进(例如,使用RegEx对字符串对象、对文件对象等),但显然不会自动生成任何测试存根,也不会反思代码及其属性,并为我准备一套工具。

    请不要告诉我,我只是在展示代码,这是一个愚蠢的包装,围绕着从静态工厂方法中提供的路径步骤列表中创建路径的概念。这是一个完全虚构的示例,但它展示了参数验证的“几个”案例...如果我包括一个更长的例子,谁会真正阅读这篇文章?

  • 共有1个答案

    莫河
    2023-03-14

    >

  • 考虑使用ExpectedException而不是@test(Expected...。这是因为,例如,如果您期望出现NullPointerException,并且测试在设置中抛出此异常(在调用测试中的方法之前),那么测试将通过。使用ExpectedException,您将expect放在调用测试中的方法之前,这样就不会出现这种情况。此外,ExpectedException允许您测试异常消息,如果您有两个不同的

    考虑将测试中的方法与设置和验证隔离开来,这将简化测试审查和维护。当被测试类上的方法作为设置的一部分被调用时尤其如此,这可能会混淆哪个是被测试的方法。我使用以下格式

    public void test() {
       //setup
       ...
    
       // test (usually only one line of code in this block)
       ...
    
       //verify
       ...
    }
    

    参考书籍:干净的代码,JUnit在行动,通过示例测试驱动开发

    Clean Code有一个很好的测试部分

    我所见过的大多数示例(包括Eclipse autogenerates)都在测试标题中包含了正在测试的方法。这便于审查和维护。例如:testofcomponents_nullcase。您的示例是我看到的第一个使用括起来的根据测试中的方法对方法进行分组的示例,这非常好。但是,它增加了一些开销,因为@before@after不能在封闭的测试类之间共享。

    我还没有开始使用它,但是Guava有一个测试库:guava-testlib。我没有机会玩它,但它似乎有一些很酷的东西。例如:NullPointerTest是引号:

      null

    在测试root时,正如前面所指出的,我建议调用root.getcomponents一次,并对其进行所有三个验证。此外,ITIterableContainingInOrder执行not empty、size和contains中的所有三个操作。测试中的是额外的(尽管它是语言上的),我觉得不值得使用(IMHO)。

    在测试ToString时,我觉得隔离测试中的方法非常有帮助。我应该编写toStringisSlashSeparatedPathofComponents如下所示。请注意,我没有使用测试类中的常量。这是因为在IMHO中,对被测试类的任何功能更改都应该导致测试失败。

    @Test     
    public void toStringIsSlashSeparatedPathOfComponents() {       
       //setup 
       String[] components = { "Test1", "Test2", "Test3" };       
       String expectedPath =  "/" + Joiner.on("/").join(components);   
       MyPath path = MyPath.ofComponents(components)
    
       // test
       String value = path.toStrign();
    
       // verify
       assertThat(value, equalTo(expectedPath));   
    } 
    

    封闭将不会运行任何不在内部类中的单元测试。因此TestPathCreationFromComponents不会运行。

    最后,使用测试驱动开发。这将确保您的测试以正确的原因通过,并按预期失败。

  •  类似资料:
    • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理

    • 本文向大家介绍Spring Boot 单元测试JUnit的实践,包括了Spring Boot 单元测试JUnit的实践的使用技巧和注意事项,需要的朋友参考一下 一、介绍 JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用于白盒测试和回归测试。 <!--more--> 白盒测试:把测试对象看

    • 本文向大家介绍Python Unittest自动化单元测试框架详解,包括了Python Unittest自动化单元测试框架详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python Unittest自动化单元测试框架的具体代码,供大家参考,具体内容如下 1、python 测试框架(本文只涉及 PyUnit) 参考地址 2、环境准备 首先确定已经安装有Python,之后通过安装P

    • 英文原文:http://emberjs.com/guides/testing/test-runners/ 当运行测试时,可以在很多种不同的方案里选取最适合工作流的方案。找到一种摩擦最低的运行测试的方案非常重要,因为测试是一项经常要做的事情。 浏览器 运行测试的最简单的方法是直接在浏览器中打开页面。下面将展示如何加入一个qunit的测试harness给应用,并可以针对其运行测试: 首先,从这里获取一

    • 我正在使用jUnit 5为我的Spring引导服务类做单元测试。在服务类中,我是自动装配对象,用于调用其他类中的方法。在测试用例中,@Mock没有为@Autow的类创建对象。在这里,我给出了我的代码。 我的服务级别: 我的组件类 : 我的单元测试类: pom.xml 文件 : 在运行此测试时,我在imageProcessor.dummy(name)中获得空指针异常;

    • 自动化测试 如果你想构建可靠的高质量的软件,自动化测试将是你工具箱里面非常关键的一个部分,它帮助你减少手工测试的代价,提高你的开发小组重构已有代码的能力。 自动化测试的类型  并非所有的自动化测试都是相似的,他们通常在作用域、实现方式和执行时间上有所差异,我把他们分成三种类型的测试:单元测试、集成测试和功能测试。 单元测试用于测试你代码的最小单元,在基于java的项目中这个单元就是一个方法(met

    • 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。 YApi 为了解决这个问题,开发了可视化接口自动化测试功能,只需要配置每个接口的入参和对 RESPONSE 断言,即可实现对接口的自动化测试,大大提升了接口测试的效率。 第一步,测试集合 使用 YApi 自动化测试,第一步需要做得是创建测试集合和导入接口,点击添加集合创建,创建完成

    • 1 测试内容 1.1 视觉人员测试 1.2 产品经理测试 1.3 测试人员测试 2 测试工具 2.1 UI 测试工具 2.1.1 TestComplete 2.1.2 RobotFramework 2.1.3 Katalon Studio 参考