對 main() 方法進行故障診斷
測試 main() 方法并不作用于所有的應用程序。例如,庫中不包含 main() 方法。一些確實具有 main() 方法的應用程序可能也不希望這個方法被不止一次的調用。如果您這樣做的話,靜態初始化軟件會非;靵y。它們可能不去清除一些對象和類,因為它們假定當程序存在時,虛擬機也存在,所有對象和類都將被自動清除。如果事實如此,您可能需要更深層地觀察您的應用程序,尋找第一個測試點。
但是,不要走的過深。對于相對于 test-last 開發來說的 test-first 開發,尤其是對于遺留代碼來說,您可能會遇到一個問題是,經常存在未公開的依賴關系和先決條件。一些方法假定其他對象存在并且在它們運行前已經創建了。例如,大多數菜單欄不會脫離它們的父窗體單獨起作用。 實際上,如果您試著不止一次地調用 main() 方法,jEdit 就會變得非;靵y。我希望能一次也不調用它。但是,很多其他代碼依賴于 jEdit.initSystemProperties() 方法已經被調用,并且這個方法是私有的。執行它的惟一方法就是調用 main()。我采用的解決方法是,只有當 main() 方法一次也沒被調用過的時候才調用它,如下所示:
private static boolean hasMain = false;
protected void setUp() {
if (!hasMain) {
jEdit.main(new String[0]);
hasMain = true;
}
View view = jEdit.getFirstView();
while (view == null) {
// First window may take a little while to appear
view = jEdit.getFirstView();
}
menubar = view.getJMenuBar();
}
[Page]
如果能夠自由地重構正在測試的代碼,您的工作會簡單些。特別是將一些私有方法變成公有方法能夠使這個代碼編寫起來更容易。在 test-first 開發中,這些都不成問題,因為您傾向于將代碼編寫得易于測試。然而,遺留代碼幾乎不考慮可測試性,因此,您必須消除這樣的阻礙。
介紹裝備
一旦編寫了第一個測試,您就能夠經?焖俚貜耐粋框架下開發更多的測試。將初始化和清理代碼放入 setUp() 和 tearDown() 方法中,注意從那里您可以真正快速地編寫多少測試。例如,我編寫過一些基礎測試來保證 jEdit 菜單欄出現并且在正確的地方顯示正確的菜單,如清單 2 所示:
清單 2. 測試 jEdit 菜單
package org.jedit.test;
import javax.swing.*;
import org.gjt.sp.jedit.*;
import junit.framework.TestCase;
public class MenuTest extends TestCase {
private JMenuBar menubar;
private static boolean hasMain = false;
protected void setUp() {
if (!hasMain) {
jEdit.main(new String[0]);
hasMain = true;
}
View view = jEdit.getFirstView();
while (view == null) {
// First window may take a little while to appear
view = jEdit.getFirstView();
文章來源于領測軟件測試網 http://www.kjueaiud.com/