我是第一次使用MVC框架,我想了解一下jUnit测试,我已将我的主项目添加到新软件包中,并且我试图实现我的jUnit测试所在的项目的新测试包。
我的模型类是对大量课程说话的类,所以我认为最好先对它进行junit测试。那么我该如何进行简单的测试和建立呢?
模型类
public class GateInfoDatabase extends Observable {
/**
* A constant: the number of aircraft gates at the airport.
*/
public int maxGate = 3;
private Gate[] gates = new Gate[maxGate];
public GateInfoDatabase(){
Gate gate0 = new Gate(0);
Gate gate1 = new Gate(1);
Gate gate2 = new Gate(2);
gates[0] = gate0;
gates[1] = gate1;
gates[2] = gate2;
}
/**
* Obtain and return the status of the given gate identified by the gateNumber parameter.
* @return
*/
public Gate getGate(int gateNumber){
Gate result = gates[gateNumber];
return result;
}
/**
* Obtain and return the status of the given gate identified by the gateNumber parameter.
* @return
*/
public Gate getGateByMCode(int mCode){
Gate result = null;
for(int i = 0; i < gates.length; i++) {
if(mCode == gates[i].getmCode()) {
result = gates[i];
System.out.print(result);
}
}
return result;
}
/**
* Obtain and return the status of the given gate identified by the gateNumber parameter.
* @return
*/
public int getStatus(int gateNumber){
return gates[gateNumber].getStatus();
}
/**
* Obtain and return the status of the given gate identified by the gateNumber parameter.
* @return
*/
public int getStatusByMCode(int mCode){
int nStatus = ManagementRecord.FREE;
Gate result = getGateByMCode(mCode);
if(result!=null) {
nStatus = result.getStatus();
}
return nStatus;
}
/**
* Returns an array containing the status of all gates.
* For data collection by the GOC.
*/
public int[] getStatuses(){
int[] statuses = new int[maxGate];
for(int i = 0; i < maxGate; i++){
statuses[i] = gates[i].getStatus();
}
return statuses;
}
/**
* Forward a status change request to the given gate identified by the gateNumber parameter. Called to allocate a free gate to the aircraft identified by mCode.
*/
public void allocate(int gateNumber, int mCode){
gates[gateNumber].allocate(mCode);
setChanged();
notifyObservers();
}
/**
* Forward a status change request to the given gate identified by the gateNumber parameter. Called to indicate that the expected aircraft has arrived at the gate.
*/
public void docked(int gateNumber){
gates[gateNumber].docked();
setChanged();
notifyObservers();
}
/**
* Forward a status change request to the given gate identified by the gateNumber parameter. Called to indicate that the aircraft has departed and that the gate is now free.
*/
public void departed(int gateNumber){
gates[gateNumber].departed();
setChanged();
notifyObservers();
}
public int getmCode(int gateNumber){
return gates[gateNumber].getmCode();
}
}
测试课,由于有3个门,我想返回3。
public class GateTest {
GateInfoDatabase model = new GateInfoDatabase();
@Before
public void setUp() throws Exception {
model = new GateInfoDatabase();
}
@After
public void tearDown() throws Exception {
model = null;
}
@Test
public void testCreate() {
assertNotNull("Model not created properly", model);
assertEquals("Initial gate setup is wrong",
model.maxGate, model.getStatuses().length);
}
}
答案 0 :(得分:0)
单元测试不是一个简单的主题,您应该在其他地方找到一些教程或阅读本书,以了解如何正确地完成它。
解释单元测试的最简单方法是说它用于测试其他类中的类和方法,看它们是否正常工作。
如果要遵循约定创建测试时,您应将Example
命名为您正在测试的类,并在末尾添加Test,因此类ExampleTest
应该具有名为{{1的测试类}}。
现在在ExampleTest
内,您可以通过测试方法测试行为,一种方法可以, 应该有更多测试。在命名test methods
时,有许多不同的方法,这里很少流行:
[tested behavior]_[tested input or state]_[expected result]
- 我更喜欢这个项目[behavior being tested]
- 测试简单的事情时test[behavior being tested]
- 我不想放测试词,因为它有点明显现在你测试的东西可能不同,它们从用例到用例都有所不同,但是应该检查的东西总是很少有标准情况应该总是通过(以确保方法首先工作)和边缘情况例如,在采用null
,0
,Integer.[MAX/MIN]_VALUE
,空字符串/集合/数组,负数索引和其他&#34;关键&#34;时,方法的行为方式值。
例如,让我们看看getGate
,如果您编写上面提到的几个测试用例,您将看到它失败,-1,3或Integer.MAX_VALUE都是方法可以采用的有效值,但它会对于其中任何一个都失败了,所以现在你可以选择改进其他方法来处理那些,添加几个如果检查值,如果它是有效的你可以返回Gate
否则你应该抛出异常。
是的,也许您知道您只有3个门并且不会尝试使用更大的号码来呼叫它,但是如果您选择在6个月内更改该代码怎么办?那你会记得吗?
因此,请务必始终处理大多数&#34;失败案例&#34;这是显而易见的,当你面对新的时,也要确保修复它们。这就是为什么我们进行单元测试的主要原因,另一方面是为了确保单个代码单元正常工作,因为如果这些小代码没有做到应该怎样才能使整个程序正常工作?