Java 带参数的JUnit测试

Java 带参数的JUnit测试,java,junit,arguments,parameterized,Java,Junit,Arguments,Parameterized,我开发了一个基于web的应用程序,在某种程度上,让用户只需输入值而不是编写一个完整的JUnit测试来提交一个测试用例 到目前为止,我使用的方法是为每次提交生成一个测试类,然后编译并运行它 例如,假设我们有一个类似于bellow的类: public class CalculatorO { public boolean isPrime( int n ) { if (n < 2) { return false; }

我开发了一个基于web的应用程序,在某种程度上,让用户只需输入值而不是编写一个完整的JUnit测试来提交一个测试用例

到目前为止,我使用的方法是为每次提交生成一个测试类,然后编译并运行它

例如,假设我们有一个类似于bellow的类:

public class CalculatorO
{    
    public  boolean isPrime( int n )
    {
        if (n < 2) {
            return false;
        }
        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (n % i == 0) {
                count++;
            }
        }
        if (count == 2) {
            return true;
        } else {
            return false;
        }
    }
}
public class CalculatorM0
{    
    public  boolean isPrime( int n )
    {
        if (n < 2) {
            return false;
        }
        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (n * i == 0) {
                count++;
            }
        }
        if (count == 2) {
            return true;
        } else {
            return false;
        }
    }    
}
然后,例如,当用户提交一个数字3作为输入值时,我操作测试模板如下:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals;
import org.junit.Test;

public class CalculatorOCalculatorM0Test30099 {
  @Test
  public void isPrime() {
    int AO = 3;     
    int AM = 3;

    CalculatorO calculatorO = new CalculatorO();
    CalculatorM3 calculatorM3 = new CalculatorM3();

    boolean resultO = calculatorO.isPrime(AO);
    boolean resultM = calculatorM3.isPrime(AM);

    assertEquals(resultO, resultM);     
  }
}
java -cp .;../../JUnitLibs/junit-4.12.jar;../../JUnitLibs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorOCalculatorM0Test30099 > CalculatorOCalculatorM0Test30099Result -input 3
然后我编译测试用例并运行它

主要的问题是,这种循环经常发生,而且由于服务器被迫加载,由于正在创建和编译文件,服务器面临内存不足的问题,并且经常崩溃

我正在寻找一种方法,创建一次测试用例,构建一次,然后为每个带有参数的输入运行它

我的意思是这样的:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals;
import org.junit.Test;

public class CalculatorOCalculatorM0Test30099 {
  @Test
  public void isPrime() {
    int AO = 3;     
    int AM = 3;

    CalculatorO calculatorO = new CalculatorO();
    CalculatorM3 calculatorM3 = new CalculatorM3();

    boolean resultO = calculatorO.isPrime(AO);
    boolean resultM = calculatorM3.isPrime(AM);

    assertEquals(resultO, resultM);     
  }
}
java -cp .;../../JUnitLibs/junit-4.12.jar;../../JUnitLibs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorOCalculatorM0Test30099 > CalculatorOCalculatorM0Test30099Result -input 3
一个简单的解决方案:

  • 我会在命令行中传递这些参数
  • 将@BeforeClass方法添加到测试用例中。。。在这里,您转到属性,并从中读取所有必需的值
换句话说:您使用一些
-Darg1:value1
值调用您的测试用例;您的测试用例会查找“arg1”;并将提供的值存储到一些字段中,例如AO和AM

当然,您必须稍微修改代码;这里棘手的部分可能是变量类型(属性都是字符串;但您可能需要int、float等变量)。更进一步,您只需创建一个助手类,该类提供以下方法:

public static class PropertyWrapper {
  int getInt(String propertyName) { ...
然后你把你的图案替换成

int AO = PropertyWrapper.getInt({{valueAPropertyName}});

当然,这只在不同的JVM运行不同的用户请求时(很容易)起作用。含义:当您有两个java运行,并且为每个运行赋予不同的参数时,每个单元测试都会看到不同的值。当您有一个JVM,该JVM应该使用不同的参数多次运行此测试时,事情就会变得更加复杂。然后让getInt()方法有一个值列表;一个接一个地回来,;或者类似的东西。

查看我使用Zohhak进行参数化测试:@Dawood ibn Karim,这样,在构建文件之前,参数应该出现在测试类中。但是我提到的参数在运行时很快就出现了。虽然很长一段时间没有给出答案,但从那时起我就在使用这个解决方案,它是完美的。如果有人需要源代码示例,我也可以与大家分享。谢谢@GhostCat.@GhostCat,我想我不明白你的真正意思。如果有什么我能做的,就告诉我。谢谢你的回答。这些系统属性在每个实例中是独立的吗?我的意思是,如果两个测试用例同时到达这个阶段呢?如果我没有错,java的每个进程都使用不同的JVM。这是真的吗?我不知道你的设置是怎么做的。但是当您在命令行上询问:“调用java时,无论什么”;这会导致独立的JVM实例吗?答案很简单:是的。