如何在另一个测试类中重用JUnit测试?
例如:
public TestClass1 {
@Test
public void testSomething(){...}
}
public TestClass2 {
@Test
public void testSomethingAndSomethingElse() {
// Somehow execute testSomething()
// and then test something else
}
}
答案 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)
像往常一样,你可以:
TestClass2
TestClass1
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;
例如,可能存在加密和解密过程,在其中必须标识加密顺序>解密。另一方面,当测试过程独特时,可以使用不同的算法。