在JUnit测试用例中使用不同的数据子集测试不同的方法

时间:2015-09-23 09:53:05

标签: java junit parameterized parameterized-unit-test

假设我有一个JUnit测试用例:

@RunWith(Parameterized.class)
public class TestMyClass {

    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] {     
             { 0,1 }, { 1,2 }, { 2,3 }, { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       });
    }

    @Test
    public void test1 { //test }

    @Test
    public void test2 { //test }

}

我想只使用{0,1},{1,2}和{2,3}运行test1 并使用{3,4},{4,5} {5,6}

运行test2

我怎样才能做到这一点?

编辑:在运行时从文件读取参数。

3 个答案:

答案 0 :(得分:2)

似乎使用JUnit标准'@Parameters'的东西,你无法在一次类中使用不同的测试参数集。 你可以尝试junit-dataprovider。它类似于TestNG数据提供者。 例如:

@RunWith(DataProviderRunner.class)
public class TestMyClass {

    @DataProvider
    public static Object[][] firstDataset() {
    return new Object[][] {     
             { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       };
    }


    @DataProvider
    public static Object[][] secondDataset() {
    return new Object[][] {     
             { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
       };
    }

    @Test
    @UseDataProvider("firstDataset")
    public void test1(int a, int b) { //test }

    @Test
    @UseDataProvider("secondDataset")
    public void test2(int a, int b) { //test }

}

或者您可以为每个测试创建2个类。

但我认为使用junit-dataprovider更方便。

答案 1 :(得分:1)

有很多junit库允许你这样做。如果你事先知道你的参数(看起来像你的情况),parametrized testing with zohhak可能是最简单的:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider

class Plotter:
    def __init__(self):
        self.fig, self.ax = plt.subplots()

    def plot(self, obj):
        self.obj = obj
        self.l = plt.plot(obj.t,obj.series())
        vars = obj.get_variables()
        plt.subplots_adjust(bottom=0.03*(len(vars)+2))
        for i,var in enumerate(vars):
            self.add_slider(i*0.03, var[0], var[1], var[2])
        plt.show()

    def add_slider(self, pos, name, min, max):
        ax = plt.axes([0.1, 0.02+pos, 0.8, 0.02], axisbg='lightgoldenrodyellow')
        slider = Slider(ax, name, min, max, valinit=getattr(self.obj, name))
        def update(val):
            setattr(self.obj, name, val)
            self.l.set_ydata(self.obj.series())
            self.fig.canvas.draw_idle()
        slider.on_changed(update)

class SinFunction:
    def __init__(self):
        self.freq = 1.0
        self.amp = 0.5
        self.t = np.arange(0.0, 1.0, 0.001)

    def series(self):
        return self.amp*np.sin(2*np.pi*self.freq*self.t)

    def get_variables(self):
        return [
            ('freq', 0.1, 10),
            ('amp', 0.1, 1)
        ]

Plotter().plot(SinFunction())

如果您需要在运行时构建参数(生成,从文件读取等),那么您可以查看junit-dataproviderjunit-params

等内容

答案 2 :(得分:1)

如果您不想使用其他图书馆,可以使用JUnit的Enclosed参赛者:

@RunWith(Enclosed.class)
public class ATest {

  @RunWith(Parameterized.class)
  public static class TestMyClass {

    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {     
         { 0,1 }, { 1,2 }, { 2,3 }  
      });
    }

    @Test
    public void test1 {
      //test
    }
  }

  @RunWith(Parameterized.class)
  public static class TestMyClass {
    @Parameter
    private int expected;
    @Parameter
    private int actual;  

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {     
         { 3,4 }, { 4,5 }, { 5,6 },{ 6,7 }  
      });
    }

    @Test
    public void test2 {
      //test
    }
  }
}

顺便说一下:你不必用带有JUnit 4.12的List包装参数。

@Parameters
public static Object[][] data() {
  return new Object[][] {     
     { 0,1 }, { 1,2 }, { 2,3 }  
  };
}