如何在另一个测试类中重用现有的JUnit测试?

时间:2013-06-17 09:47:39

标签: java unit-testing junit

如何在另一个测试类中重用JUnit测试?

例如:

public TestClass1 {
    @Test
    public void testSomething(){...}
}

public TestClass2 {
    @Test
    public void testSomethingAndSomethingElse() {
        // Somehow execute testSomething()
        // and then test something else
    }
}

4 个答案:

答案 0 :(得分:34)

一般来说,避免这种情况。它很容易使测试更加脆弱。如果TestClass1失败,则TestClass2会隐式失败,这至少是由于以下原因所不可取的:

  • 代码不止一次被测试,这浪费了执行时间。
  • 测试不应该相互依赖,它们应该尽可能地分离
  • 如果这成为一种模式,通过查看哪些测试失败来识别哪部分代码会变得更难,这是测试点的一部分

偶尔共享测试代码部分很有用,特别是对于集成测试。以下是您可以不依赖于测试本身的方法:

public abstract BaseTests {

    protected void somethingHelper() {
        // Test something
    }
}

public TestClass1 extends BaseTests {
    @Test
    public void testSomething(){
        somethingHelper();
    }
}

public TestClass2 extends BaseTests {
    @Test
    public void testSomethingAndSomethingElse() {
        somethingHelper();
        // and then test something else
    }
}

或者,您可以使用帮助程序类并完全避免继承。断言等可以使用somethingHelper()方法。

请勿直接从TestClass1中的TestClass2调用方法。测试用例以这种方式变得不那么可读,并且可以导致spaghetti frittata

答案 1 :(得分:8)

像往常一样,你可以:

  1. TestClass2
  2. 延长TestClass1
  3. 使用委派
  4. TestClass1访问TestClass2

    示例1:

    // Instantiate TestClass1 inside test method
    public TestClass2 {
        public void testSomethingAndSomethingElse1() {
             new TestClass1().testSomething();
        }
    }
    

    示例2:

    // Instantiate TestClass1 as a member of TestClass2
    public TestClass2 {
        private TestClass1 one = new TestClass1();
        public void testSomethingAndSomethingElse1() {
             one.testSomething();
        }
    }
    

答案 2 :(得分:1)

逻辑上,没有理由从另一个调用一个测试方法。任何运行一次测试的工具都可以轻松地在包中进行所有测试。但是如果你需要,你可以像任何其他类中的任何其他方法一样调用它。

您最想要做的是为两种测试方法执行一些常见设置。您可以将that代码放在公共类中的实用程序方法中,并在两个测试中调用公共代码。

答案 3 :(得分:1)

使用不同的配置运行测试很常见。不用担心,继续前进。

第一步,无需考虑任何配置即可创建自己的测试:

static navigationOptions = {
    title: 'Login', 
    header: {
        title: "Title",
        style: {
          backgroundColor: 'red'
        },
        tintColor: 'red'
      }
};

然后,扩展测试类并添加一些配置:

   const colors = scaleOrdinal(schemeCategory10)
      .domain([this.props.data]);

不必进行特定的配置,但是在可配置系统中非常常见(系统的主要功能必须对每个配置均有效)。

在另一个测试用例中:

class Legend extends React.Component {

  componentDidMount() {
    const {fill, data} = this.props;
    let svgLegend = select('#legend');

    if(data) {
    // add a title
      svgLegend.append('text')
        .attr('font-size', '12px')
        .attr('font-family', 'HelveticaNeue-Bold, Helvetica, sans-serif')
        .attr('y', 20)
        .text('Title');

      const names= data.map(item => item.stim_name);

      svgLegend.append('g')
        .selectAll('text')
        .data(names)
        .enter()
        .append('text')
        .attr('font-size', '10px')
        .attr('font-family', 'HelveticaNeue-Light, Helvetica, sans-serif')
        .attr('x', 200)
        .attr('y', function(d, i){ return 60 + (15 * i); })
        .text(function(d){ return d; });

    }

  }

  render() {


    return (
      <svg id='legend'></svg>
    );
  }
}

export default Legend;

例如,可能存在加密和解密过程,在其中必须标识加密顺序>解密。另一方面,当测试过程独特时,可以使用不同的算法。

相关问题