我只是在學習JUnit測試程序,並已經通過了所有我可以找到的教程。我理解實現基本測試的概念,比如一個方法需要幾個輸入並使用它們來計算返回值。在這種情況下,編寫一個測試來確定期望的返回值應該是什麼,這很簡單。爲更復雜的方法編寫JUnit測試
但是,當有更復雜的方法進行測試時,例如可能使用從Random對象生成的數字,或者需要測試不返回值的方法時,會做什麼?
舉例來說,我已經爲我想編寫一個測試下面的方法:
// Requirement 9.5.0
public void firePhotonTorpedos(TrekGUI gui, Starship target, int score)
{
// Requirement 9.5.1.1
// Torpedoes can either hit or miss.
Random rand = new Random();
boolean hit = false;
int isItAHit= rand.nextInt(10);;
int damage = 0;
//80 % chance of hitting target
if(isItAHit < 8)
{
hit = true;
}
// if it was a hit, calculate damage
if(hit)
{
//damage between 30 and 50
damage = rand.nextInt(21) + 30;
target.setHitPoints(target.getHitPoints() - damage);
}
this.setPhotonTorpedos(this.getPhotonTorpedos() - 1);
// Requirement 5.4.1
this.setEnergy(this.getEnergy() - 50);
//if target hit but not destroyed, say so
if(hit && target.getHitPoints() > 0)
{
gui.getBottomPanel().getConsole().append("\nVessel at " + target.getQuadrantLocation() + ", " + target.getSectorLocation() + " damaged.");
gui.getBottomPanel().getConsole().append("\n" + damage + " units damage.");
}
//if target destroyed, say so and remove its ship
// Requirement 6.2.0
else if(hit && target.getHitPoints() < 0)
{
//warship is gone, so set its contains field to false and remove its icon
target.getSectorLocation().setContainsWarship(false);
target.getSectorLocation().getSectorView().hideWarshipIcon();
klingonsLeft = klingonsLeft - 1;
gui.getBottomPanel().getConsole().append("\n" + damage + " units damage.");
gui.getBottomPanel().getConsole().append("Vessel at " + target.getQuadrantLocation() + ", " + target.getSectorLocation() + " destroyed.");
// Increase score (bonus depending on how much energy is left)
int bonus = this.getEnergy()/20;
score = score + (50 + bonus);
}
//if it was a miss, say so
else
{
gui.getBottomPanel().getConsole().append("Torpedo missed.");
}
}
我怎麼會寫這樣一個正式的測試?由於我在碼連續3條斷言語句,我知道我應該通過代碼有三個不同的路徑:
火魚雷>命中(無)>結束
火魚雷>擊(是)>計算損害>破壞(無)>船隻仍然>結束
火魚雷>擊(是)>計算損害>破壞(是)>船不見了>結束
所以,如果我要得到完整的路徑覆蓋,例如,我需要編寫至少三個表達這些條件的測試用例。很容易看出這些值可能是什麼。但是,我如何使用它們來編寫測試?例如,JUnit可以訪問我的代碼中的布爾命中值,以便我可以在不使用隨機數的情況下定義值?我知道我可以通過代碼來看看它是否工作(我有),但我被告知我應該使用更正式的測試手段,如JUnit。
我希望這些問題有意義。我只是希望更好地瞭解這種測試是如何在真實世界的場景中完成的。
謝謝,這很有幫助。你認爲你可以給我示例一個新的Random()調用帶無參數重載的方法嗎?我不太瞭解那部分。 – Kallaste