我想知道,在单元测试中,是不是更好的做法是示例化对象,如Sets、Maps、LinkedLists或Arrays作为类的field,然后在每个**@Test之前运行的@Before方法中清除它们?或者是不是更好的做法是简单地示例化@Before方法中的对象,但将它们声明为类的field*?
1,例如,清除/清空数据结构并重新使用
public class MyUnitTestExample1 {
// Declare variable as field of class/member variable
private Set<String> set = new HashSet<>();
private Map<String, Integer> map = new HashMap<>();
@Before
public void setUp() {
// Data structure should be cleared before each test, but only instantiated 1 time?
set.clear();
map.clear();
}
2,例如,每个测试示例化新对象,但声明为类的字段,以便类中的每个**@测试**都可以访问它
public class MyUnitTestExample2 {
// Declare variable as field of class/member variable
private Set<String> set;
private Map<String, Integer> map;
@Before
public void setUp() {
// Instantiate here
set = new HashSet<>();
map = new HashMap<>();
}
...一个比另一个更好吗?更有效吗?更快吗?我认为清除数据结构的内容并示例化一次(或者我认为它会这样做)更快?
2条答案
按热度按时间cgvd09ve1#
清除
@BeforeEach
中的示例变量没有任何意义- JUnit为每个测试示例化测试类的新示例。输出量
8zzbczxx2#
1.我认为在这种情况下,性能并不重要。清除或新建一个HashMap/Set以及通过垃圾收集清除旧对象都应该花费最少的时间。即使有数千个条目,填充Map/Set也比清除它花费更长的时间。
1.你应该更关心的是在单元测试类中使用变量,这些变量对于该类的单元测试是“全局”的。我看不到这样做的好处。我会在每个单元测试中使用一个新的集合/Map来分隔类中的另一个测试。否则,根据测试的执行顺序,你可能会有副作用。过去我遇到过一些奇怪的情况,测试会产生不同的结果,因为开发人员运行在Windows上,而CI服务器运行在Linux上。