首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JUNIT -使用字符串进行多个测试

Java JUNIT -使用字符串进行多个测试
EN

Stack Overflow用户
提问于 2017-01-05 21:59:18
回答 2查看 817关注 0票数 2

我试图通过尊重best practices来实现单元测试。其中一条规则是只使用一个"assert“by方法。我想实现几个方法的测试,因为有一个沉重的处理,这是在每个方法的开始(插入数据库->5秒)。

我开发了这个解决方案,它是一个好的实践吗?

代码语言:javascript
复制
String failuresMsg = "";
if(9 != var1) 
    failuresMsg += "[var1 <9," + var1+">]";
if(9 != var2) 
    failuresMsg += "[var2 <9," + var2+">]";
if(9 != var3) 
    failuresMsg += "[var3 <9," + var3+">]";
if(9 != var4) 
    failuresMsg += "[var4 <9," + var4+">]";

assertEquals("", failuresMsg);
EN

回答 2

Stack Overflow用户

发布于 2017-01-05 22:39:09

assert规则之一是只使用一个“

”by方法。

不,您应该将自己限制为通过测试方法来测试场景。这不是一回事。

代码语言:javascript
复制
String failuresMsg = "";
if(9 != var1) 
    failuresMsg += "[var1 <9," + var1+">]";
if(9 != var2) 
    failuresMsg += "[var2 <9," + var2+">]";
if(9 != var3) 
    failuresMsg += "[var3 <9," + var3+">]";
if(9 != var4) 
    failuresMsg += "[var4 <9," + var4+">]";

assertEquals("", failuresMsg);

一般来说,当你有一个范围可接受的值时,你至少应该测试这个范围的界限和这个范围的一个或几个内部值。

如果参加你的测试,它会给出两种测试方法(或根据看待事物的方式更多),因为我有两种截然不同的场景:

  • the value is acceptable
  • the value is not acceptable

(无法接受该值为可接受的值

对于每个场景,如果代码和测试的可维护性保持良好,我可以执行所需的任何断言。

下面是一个示例代码:

代码语言:javascript
复制
@Test
public void doMethodWithAcceptableValues(){
   int testValue = 0;
   Assert.assertTrue(objUnderTest.doMethod(testValue));
   testValue = 100; // limit value
   Assert.assertTrue(objUnderTest.doMethod(testValue));
   testValue = 50; // middle value 50. it is an example
   Assert.assertTrue(objUnderTest.doMethod(testValue));
}

@Test
public void doMethodWithNotAcceptableValues(){
   int testValue = -1;
   Assert.assertFalse("-1 not acceptable", objUnderTest.doMethod(testValue));
   testValue = 101; // limit value
   Assert.assertFalse("101 not acceptable", objUnderTest.doMethod(testValue));
}

如果间隔不是很重要,您可以使用JUnit机制(参数化测试)或创建自己的方法来执行此逻辑,例如,如果间隔不是太重要,则不会阻止您测试所有值。

在许多情况下,家庭处理更加简单、可读和可维护。

票数 3
EN

Stack Overflow用户

发布于 2017-01-05 22:42:18

我认为,您可以在测试中使用JUnitParamsRunner。如果你使用它,你可以在test方法中添加参数。然后,您可以从方法体中删除if。

示例:

代码语言:javascript
复制
@RunWith(JUnitParamsRunner.class)
public class TestSomething{

  @Test
  @Parameters({ "A", "B", "C" })
  public void shouldDoSomething(String s){

    assertEquals(s, "s");
  }

  //OR

  @Test
  @Parameters(method = "data")
  public void shouldSomething(String a, String b){

   assertEquals(a,b);
  }

  @SuppressWarnings("unused")
  private Object[] data() {
  return $( //
     $("A", "B") //
  );
 }
}

我认为,比起测试中的meny if更好,更具可读性,因为你只有一个断言,起始值在测试期间不会改变,而且参数非常容易扩展和维护。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41486958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档