可以用main函數(shù)和JUnit來寫測試代碼。main是最早使用的,但是現(xiàn)在更流行的測試工具是JUnit。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計(jì),茂名網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:茂名等地區(qū)。茂名做網(wǎng)站價(jià)格咨詢:13518219792
JUnit是一個(gè)Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中最為成功的一個(gè)。 JUnit有它自己的JUnit擴(kuò)展生態(tài)圈。多數(shù)Java的開發(fā)環(huán)境都已經(jīng)集成了JUnit作為單元測試的工具。
下面是一些具體的編寫測試代碼的技巧或較好的實(shí)踐方法:
1. 不要用TestCase的構(gòu)造函數(shù)初始化Fixture,而要用setUp()和tearDown()方法。
2. 不要依賴或假定測試運(yùn)行的順序,因?yàn)镴Unit利用Vector保存測試方法。所以不同的平臺(tái)會(huì)按不同的順序從Vector中取出測試方法。
3. 避免編寫有副作用的TestCase。例如:如果隨后的測試依賴于某些特定的交易數(shù)據(jù),就不要提交交易數(shù)據(jù)。簡單的回滾就可以了。
4. 當(dāng)繼承一個(gè)測試類時(shí),記得調(diào)用父類的setUp()和tearDown()方法。
5. 將測試代碼和工作代碼放在一起,一邊同步編譯和更新。(使用Ant中有支持junit的task.)
6. 測試類和測試方法應(yīng)該有一致的命名方案。如在工作類名前加上test從而形成測試類名。
7. 確保測試與時(shí)間無關(guān),不要依賴使用過期的數(shù)據(jù)進(jìn)行測試。導(dǎo)致在隨后的維護(hù)過程中很難重現(xiàn)測試。
8. 如果你編寫的軟件面向國際市場,編寫測試時(shí)要考慮國際化的因素。不要僅用母語的Locale進(jìn)行測試。
9. 盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡潔。
10.測試要盡可能地小,執(zhí)行速度快。
11.不要硬性規(guī)定數(shù)據(jù)文件的路徑。
12.利用Junit 的自動(dòng)異常處理書寫簡潔的測試代碼
事實(shí)上在Junit 中使用try-catch 來捕獲異常是沒有必要的,Junit 會(huì)自動(dòng)捕獲異常。那些沒有被捕獲的異常就被當(dāng)成錯(cuò)誤處理。
13. 充分利用Junit 的assert/fail 方法
assertSame()用來測試兩個(gè)引用是否指向同一個(gè)對象
assertEquals()用來測試兩個(gè)對象是否相等
14. 確保測試代碼與時(shí)間無關(guān)
15. 使用文檔生成器做測試文檔。
你這說的太籠統(tǒng)了,應(yīng)該具體些。
有了Java代碼之后
1、可以在代碼中寫些測試的方法,把你想要驗(yàn)證的東西,輸出看一下。
2、可以用Debug的形式,跟蹤代碼執(zhí)行,驗(yàn)證程序的邏輯是否正確。
3、利用JUnit寫斷言,測試結(jié)果
單元測試是我們在軟件開發(fā)過程中經(jīng)常用到的一種軟件測試的方法,而今天我們就一起來了解一下,一個(gè)好的單元測試都是如何來編輯完成的。
1.使用框架來用于單元測試
Java提供了若干用于單元測試的框架。TestNG和JUnit是流行的測試框架。JUnit和TestNG的一些重要功能:
易于設(shè)置和運(yùn)行。
支持注釋。
允許忽略或分組并一起執(zhí)行某些測試。
支持參數(shù)化測試,即通過在運(yùn)行時(shí)指定不同的值來運(yùn)行單元測試。
通過與構(gòu)建工具,如Ant,Maven和Gradle集成來支持自動(dòng)化的測試執(zhí)行。
EasyMock是一個(gè)模擬框架,是單元測試框架,如JUnit和TestNG的補(bǔ)充。EasyMock本身不是一個(gè)完整的框架。它只是添加了創(chuàng)建模擬對象以便于測試的能力。例如,我們想要測試的一個(gè)方法可以調(diào)用從數(shù)據(jù)庫獲取數(shù)據(jù)的DAO類。在這種情況下,EasyMock可用于創(chuàng)建返回硬編碼數(shù)據(jù)的MockDAO。這使我們能夠輕松地測試我們意向的方法,而不必?fù)?dān)心數(shù)據(jù)庫訪問。
2.謹(jǐn)慎使用測試驅(qū)動(dòng)開發(fā)!
測試驅(qū)動(dòng)開發(fā)(TDD)是一個(gè)軟件開發(fā)過程,在這過程中,在開始任何編碼之前,我們基于需求來編寫測試。由于還沒有編碼,測試初會(huì)失敗。然后寫入小量的代碼以通過測試。然后重構(gòu)代碼,直到被優(yōu)化。
目標(biāo)是編寫覆蓋所有需求的測試,而不是一開始就寫代碼,卻可能甚至都不能滿足需求。TDD是偉大的,因?yàn)樗鼘?dǎo)致簡單的模塊化代碼,且易于維護(hù)。總體開發(fā)速度加快,容易發(fā)現(xiàn)缺陷。此外,單元測試被創(chuàng)建作為TDD方法的副產(chǎn)品。
然而,TDD可能不適合所有的情況。在設(shè)計(jì)復(fù)雜的項(xiàng)目中,專注于簡單的設(shè)計(jì)以便于通過測試用例,而不提前思考可能會(huì)導(dǎo)致巨大的代碼更改。此外,TDD方法難以用于與遺留系統(tǒng),GUI應(yīng)用程序或與數(shù)據(jù)庫一起工作的應(yīng)用程序交互的系統(tǒng)。另外,測試需要隨著代碼的改變而更新。
因此,在決定采用TDD方法之前,應(yīng)考慮上述因素,并應(yīng)根據(jù)項(xiàng)目的性質(zhì)采取措施。
3.測量代碼覆蓋率
代碼覆蓋率衡量(以百分比表示)了在運(yùn)行單元測試時(shí)執(zhí)行的代碼量。通常,高覆蓋率的代碼包含未檢測到的錯(cuò)誤的幾率要低,因?yàn)槠涓嗟脑创a在測試過程中被執(zhí)行。云南電腦培訓(xùn)發(fā)現(xiàn)測量代碼覆蓋率的一些佳做法包括:
使用代碼覆蓋工具,如Clover,Corbetura,JaCoCo或Sonar。使用工具可以提高測試質(zhì)量,因?yàn)檫@些工具可以指出未經(jīng)測試的代碼區(qū)域,讓你能夠開發(fā)開發(fā)額外的測試來覆蓋這些領(lǐng)域。
1、Jasmine
Jasmine是一個(gè)行為驅(qū)動(dòng)的測試開發(fā)框架,用于對JavaScript代碼進(jìn)行測試。它不依賴其它任何JavaScript框架,也不需要DOM。它的語法簡潔、明確,寫測試非常容易。
2、Mocha
Mocha是一個(gè)功能豐富的JavaScript測試框架,既運(yùn)行于Node.js環(huán)境中,也可以運(yùn)行于瀏覽器環(huán)境中。Mocha以串行方式運(yùn)行測試,能做出靈活而準(zhǔn)確的報(bào)告,也能將測試中未捕捉的異常映射到正確的測試用例。
3、Chai
Chai是個(gè)支持BDD/TDD的庫,可用于node和瀏覽器,可配合任何JavaScript測試框架使用。
4、QUnit
QUnit是個(gè)功能強(qiáng)大又易于使用的JavaScript單元測試框架。jQuery、jQueryUI和jQueyMobile項(xiàng)目都使用這個(gè)框架,它能測試普通的JavaScript代碼。
5、Sinon
Sinon.JS為JavaScript提供了獨(dú)立的spies、stubs和mocks[譯者注:Spy、Stub和Mock都是測試專用名詞,Stub常被翻譯為樁,spies是Spy的復(fù)數(shù)形式,是一種可以監(jiān)視方法、調(diào)用和參數(shù)的技術(shù)]。它不依賴任何東西,可以配合任何單元測試框架工作。
6、Karma
Karma是針對連通瀏覽器的一個(gè)框架無關(guān)測試運(yùn)行器。每一個(gè)測試結(jié)果對應(yīng)每個(gè)瀏覽器,它的測試和顯示都是通過命令行暴露給開發(fā)者的,這樣他們就可以看到瀏覽器測試的通過或失敗。
7、Selenium
Selenium有一個(gè)簡單的目標(biāo):就是自動(dòng)化瀏覽器。它主要用于自動(dòng)化測試web應(yīng)用程序,但是只是很簡單地考慮到了基于網(wǎng)絡(luò)的管理任務(wù)。
8、WebdriverIO
WebdriverIO允許用戶僅添加幾行代碼就可以控制瀏覽器或移動(dòng)應(yīng)用程序,使測試代碼更簡單、簡潔、易讀。集成的TestRunner同樣允許你以同步的方式調(diào)用異步命令,這樣你不需要關(guān)心如何處理Promise以避免競態(tài)條件。此外,它取消了所有的繁瑣的設(shè)置工作,并且會(huì)為您管理的Selenium會(huì)話。
9、Nightwatch
Nightwatch.js是一個(gè)易于使用的Node.js,它是為基于瀏覽器的app和網(wǎng)站設(shè)計(jì)的終端到終端(E2E)的測試方法。它使用強(qiáng)大的W3CWebDriverAPI,用于在DOM元素上執(zhí)行命令和斷言。
10、PhantomCSS
PhantomCSS獲得CasperJS捕獲的屏幕截圖,并使用Resemble.js將其與基準(zhǔn)圖進(jìn)行對比,以測試RGB像素差異。java課程發(fā)現(xiàn)PhantomCSS然后生成圖像差異對比,用于幫助您找到原因。
11、PhantomFlow
PhantomFlow使用決策樹提供UI測試方案。針對PhantomJS,CasperJS和PhantomCSS的NodeJS包裝器——PhantomFlow能夠流暢地在代碼中描述用戶流程,同時(shí)生成用于可視化的結(jié)構(gòu)化樹數(shù)據(jù)。
在軟件開發(fā)過程中,每個(gè)單元的運(yùn)行都是非常關(guān)鍵的,并且直接關(guān)系到后期程序員的運(yùn)行。那么在進(jìn)行軟件開發(fā)過程中,經(jīng)常使用到的單元測試方法有哪些呢,一個(gè)好的單元測試是如何進(jìn)行實(shí)現(xiàn)的?下面云南電腦培訓(xùn)為大家介紹進(jìn)行Java單元測試的具體方法。
1、使用框架進(jìn)行單元測試
Java能夠提供單元測試方法的框架,在測試過程中,測試NG和JUnit是現(xiàn)在流行的測試框架。JUnit和TestNG框架測試有幾個(gè)重要功能:設(shè)置和運(yùn)行很容易;允許忽略或分組,并一起運(yùn)行多個(gè)測試;支持參數(shù)化測試,并且云南IT培訓(xùn)發(fā)現(xiàn)能夠通過在運(yùn)行時(shí)指定不同的值來執(zhí)行單元測試。
2、謹(jǐn)慎使用測試驅(qū)動(dòng)開發(fā)
測試驅(qū)動(dòng)開發(fā)是一個(gè)軟件開發(fā)的過程。在整個(gè)開發(fā)過程中,在開始編碼的時(shí)候,應(yīng)該根據(jù)程序的需求進(jìn)行編程測試。但是昆明IT培訓(xùn)發(fā)現(xiàn)由于這個(gè)時(shí)候還沒有進(jìn)行編程,所以初次測試會(huì)面臨失敗,只需要寫入少量的代碼就能通過測試,進(jìn)行重置代碼。
3、測試代碼的覆蓋率
代碼覆蓋率是以百分比測定執(zhí)行單元測試時(shí)進(jìn)行的代碼量。通常,高覆蓋率的代碼包含未被檢測出的錯(cuò)誤的概率較低,因?yàn)楦嗟脑创a在測試中被執(zhí)行。測試代碼覆蓋率的工具有:Clover,Corbetura,JaCoCo。使用工具測試能夠更好的提高測試質(zhì)量。
4、將測試數(shù)據(jù)外部優(yōu)化
在JUnit4之前,測試用例執(zhí)行的數(shù)據(jù)必須被測試用例硬編碼,這會(huì)引起限制。為了使用不同的數(shù)據(jù)執(zhí)行測試,必須修正測試用例代碼。但是,昆明電腦培訓(xùn)認(rèn)為JUnit4以及TestNG支持外部化測試數(shù)據(jù),無需變更源代碼,就可以對不同的數(shù)據(jù)組執(zhí)行測試用例。
給你個(gè)例子:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseDemo
{
//定義該圖形中所需的組件的引用
private Frame f;
//方法
MouseDemo()//構(gòu)造方法
{
madeFrame();
}
public void madeFrame()
{
f = new Frame("Test Frame");
//對Frame進(jìn)行基本設(shè)置。
f.setBounds(300,100,600,500);//對框架的位置和大小進(jìn)行設(shè)置
f.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));//設(shè)計(jì)布局
//加載一下窗體上的事件
myEvent();
//顯示窗體
f.setVisible(true);
}
private void myEvent()
{
f.addWindowListener(new WindowAdapter()//窗口監(jiān)聽
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.addMouseListener(new MouseAdapter()//鼠標(biāo)監(jiān)聽
{
private int count = 1;
private int mouseCount = 1;
public void mouseClicked(MouseEvent e) {
if (e.getButton()==e.BUTTON1)
{//點(diǎn)擊鼠標(biāo)左鍵
System.out.println("鼠標(biāo)左鍵點(diǎn)擊了!!!");
}
}
});
}
public static void main(String[] agrs)
{
new MouseDemo();
}
}