⑴ junit測試在log裡面顯示已經插入數據了,但是檢索不出來
因為插入數據會自動回滾。
在伺服器上插入記錄的時候,整個事物由你的容器來完成。你應該配置了事物的相關信息吧。junit單元測的時候,需要自己手動控制事物。你在junit測試代碼中,首先session打開事物,執行操作後,session提交事務。
關於junit單元測試工具的安裝請參看第二課的內容(其實就是導入一個junit的jar包就行了)
首先認識幾個註解標簽
@Test:測試方法
@Before:初始化方法
@After:釋放資源
執行順序:@Before->@Test->@After
第一步新建測試文件夾(目的就是用來存放測試類,使項目更整潔,分類明確,好管理)
選中項目右鍵new->Source Folder 輸入文件夾的名稱例如test
在測試文件夾下創建測試類(就是創建個普通的類)
如下在測試類中使用junit進行單元測試
下面只是先搭建一個測試框架
搭建好之後測試hibernate訪問資料庫的代碼注意:導入的包不要弄錯,都是hibernate的包
public class StudentTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init(){ //創建配置對象 Configuration config = new Configuration(); //創建服務注冊對象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); //創建會話工廠對象 sessionFactory = config.buildSessionFactory(serviceRegistry); //會話對象 session = sessionFactory.openSession(); //開啟事務 transaction = session.beginTransaction(); } @Test public void testSaveStudents(){ Student s = new Student(1, "小明", new Date(), "北京xxxx街道5號樓201"); session.save(s);//保存對象到資料庫 } @After public void destory(){ transaction.commit();//提交事務 session.close();//關閉會話 sessionFactory.close();//關閉會話工廠 }}
進行測試如下: 選中測試方法右鍵run as ->junit test就行了
執行成功控制台列印信息:
查看資料庫表
可以看到增加了一條信息,測試成功
⑶ Junit怎麼測試資料庫查詢方法
@Test
public void jdbcTest() throws ClassNotFoundException, sqlException{
//載入MySql的驅動類
Class.forName("com.mysql.jdbc.Driver") ; //環境變數中需要有mysql的驅動包
//簡歷鏈接
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
Connection con = DriverManager.getConnection(url , username , password ) ;
//創建stat 並執行查詢,獲得結果集resultSet
Statement stat = con.createStatement();
ResultSet resultSet = stat.executeQuery("select * from 你的表 ");
//遍歷查詢結果集
//1 獲得元數據(就是欄位名稱)
ResultSetMetaData metad = resultSet.getMetaData();
int column = metad.getColumnCount();
System.out.println("查詢結果為【"+column+"】列");
// System.out.println("查詢結果為【"+metad.+"】條");
StringBuffer sb = new StringBuffer();
while(resultSet.next()){
for (int i = 0; i < column; i++) {
sb.append("欄位:【"+metad.getColumnName(i)+"】,欄位值【"+resultSet.getString(i)+"】\t");
}
sb.append("\n");
}
System.out.println(sb.toString());
}
⑷ 單元測試的測試工具
現在開始介紹單元測試工具,分別按編程語言進行分組介紹。 CppUnit
首先是CppUnit,這是C++單元測試工具的鼻祖,免費的開源的單元測試框架。由於已有一眾高人寫了不少關於CppUnit的很好的文章,老納就不現丑了,想了解CppUnit的朋友,建議讀一下Cpluser 所作的《CppUnit測試框架入門》,。該文也提供了CppUnit的下載地址。
C++Test
然後介紹C++Test,這是Parasoft公司的產品。[C++Test是一個功能強大的自動化C/C++單元級測試工具,可以自動測試任何C/C++函數、類,自動生成測試用例、測試驅動函數或樁函數,在自動化的環境下極其容易快速的將單元級的測試覆蓋率達到100%]。[]內的文字引自,這是華唐公司的網頁。老納想寫些介紹C++Test的文字,但發現無法超越華唐公司的網頁上的介紹,所以也就省點事了,想了解C++Test的朋友,建議訪問該公司的網站。華唐公司代理C++Test,想要購買或索取報價、試用版都可以找他們。
Visual Unit
最後介紹Visual Unit,簡稱VU,這是國產的單元測試工具,據說申請了多項專利,擁有一批創新的技術,不過老納只關心是不是有用和好用。[自動生成測試代碼 快速建立功能測試用常式序行為一目瞭然 極高的測試完整性 高效完成白盒覆蓋 快速排錯 高效調試 詳盡的測試報告]。[]內的文字是VU開發商的網頁上摘錄的,。前面所述測試要求:完成功能測試,完成語句覆蓋、條件覆蓋、分支覆蓋、路徑覆蓋,用VU可以輕松實現,還有一點值得一提:使用VU還能提高編碼的效率,總體來說,在完成單元測試的同時,編碼調試的時間還能大幅度縮短。算了,不想再講了,老納顯擺理論、介紹經驗還是有興趣的,因為可以滿足老納好為人師的虛榮心,但介紹工具就覺得索然無味了,畢竟工具好不好用,合不合用,要試過才知道,還是自己去開發商的網站看吧,可以下載演示版,還有演示課件。
gtest
gtest測試框架是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)為編寫C++測試而生成的。它是基於xUnit架構的測試框架,支持自動發現測試,豐富的斷言集,用戶定義的斷言,death測試,致命與非致命的失敗,類型參數化測試,各類運行測試的選項和XML的測試報告。需要詳細了解的朋友可以參閱《玩轉Google單元測試框架gtest系列》該篇文章。 JUnit
JUnit 是 Java 社區中知名度最高的單元測試工具。它誕生於 1997 年,由 Erich Gamma 和 Kent Beck 共同開發完成。其中 Erich Gamma 是經典著作《設計模式:可復用面向對象軟體的基礎》一書的作者之一,並在 Eclipse 中有很大的貢獻;Kent Beck 則是一位極限編程(XP)方面的專家和先驅。JUnit 設計的非常小巧,但是功能卻非常強大。JUnit ——是一個開發源代碼的Java測試框架,用於編寫和運行可重復的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。主要用於白盒測試,回歸測試。
JUnit的好處和JUnit單元測試編寫原則:
好處:可以使測試代碼與產品代碼分開;針對某一個類的測試代碼通過較少的改動便可以應用於另一個類的測試;易於集成到測試人員的構建過程中,JUnit和Ant的結合可以實施增量開發;JUnit是公開源代碼的,可以進行二次開發;可以方便地對JUnit進行擴展;
編寫原則:是簡化測試的編寫,這種簡化包括測試框架的學習和實際測試單元的編寫;是使測試單元保持持久性;是可以利用既有的測試來編寫相關的測試;
JUnit使用幫助
1、junit3.x版本,我們通常使用junit 3.8
(1)、使用junit3.x版本進行單元測試時,測試類必須要繼承於TestCase父類;
(2)、測試方法需要遵循的原則:
A、public的
B、void的
C、無方法參數
D、方法名稱必須以test開頭
(3)、不同的Test Case之間一定要保持完全的獨立性,不能有任何的關聯。
(4)、我們要掌握好測試方法的順序,不能依賴於測試方法自己的執行順序。
dome:
public class TestMyNumber extends TestCase {
private MyNumber myNumber;
public TestMyNumber(String name) {
super(name);
}
// 在每個測試方法執行 [之前] 都會被調用
@Override
public void setUp() throws Exception {
// System.out.println(歡迎使用Junit進行單元測試…);
myNumber = new MyNumber();
}
// 在每個測試方法執行 [之後] 都會被調用
@Override
public void tearDown() throws Exception {
// System.out.println(Junit單元測試結束…);
}
public void testDivideByZero() {
Throwable te = null;
try {
myNumber.divide(6, 0);
Assert.fail(測試失敗);
} catch (Exception e) {
e.printStackTrace();
te = e;
}
Assert.assertEquals(Exception.class, te.getClass());
Assert.assertEquals(除數不能為 0 , te.getMessage());
}
}
2、junit4.x版本
(1)、使用junit4.x版本進行單元測試時,不用測試類繼承TestCase父類,因為,junit4.x全面引入了Annotation來執行我們編寫的測試。
(2)、junit4.x版本,引用了註解的方式,進行單元測試;
(3)、junit4.x版本我們常用的註解:
A、@Before 註解:與junit3.x中的setUp()方法功能一樣,在每個測試方法之前執行;
B、@After 註解:與junit3.x中的tearDown()方法功能一樣,在每個測試方法之後執行;
C、@BeforeClass 註解:在所有方法執行之前執行;
D、@AfterClass 註解:在所有方法執行之後執行;
E、@Test(timeout = xxx) 註解:設置當前測試方法在一定時間內運行完,否則返回錯誤;
F、@Test(expected = Exception.class) 註解:設置被測試的方法是否有異常拋出。拋出異常類型為:Exception.class;
G、@Ignore 註解:注釋掉一個測試方法或一個類,被注釋的方法或類,不會被執行。
dome:
package com.an.junit;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestMyNumber {
private MyNumber myNumber;
@BeforeClass
// 在所有方法執行之前執行
public static void globalInit() {
System.out.println(init all method...);
}
@AfterClass
// 在所有方法執行之後執行
public static void globalDestory() {
System.out.println(destory all method...);
}
@Before
// 在每個測試方法之前執行
public void setUp() {
System.out.println(start setUp method);
myNumber = new MyNumber();
}
@After
// 在每個測試方法之後執行
public void tearDown() {
System.out.println(end tearDown method);
}
@Test(timeout=600)// 設置限定測試方法的運行時間 如果超出則返回錯誤
public void testAdd() {
System.out.println(testAdd method);
int result = myNumber.add(2, 3);
assertEquals(5, result);
}
@Test
public void testSubtract() {
System.out.println(testSubtract method);
int result = myNumber.subtract(1, 2);
assertEquals(-1, result);
}
@Test
public void testMultiply() {
System.out.println(testMultiply method);
int result = myNumber.multiply(2, 3);
assertEquals(6, result);
}
@Test
public void testDivide() {
System.out.println(testDivide method);
int result = 0;
try {
result = myNumber.divide(6, 2);
} catch (Exception e) {
fail();
}
assertEquals(3, result);
}
@Test(expected = Exception.class)
public void testDivide2() throws Exception {
System.out.println(testDivide2 method);
myNumber.divide(6, 0);
fail(test Error);
}
public static void main(String[] args) {
}
}
有興趣的朋友可以下下來仔細研究下,也可以到安安DIY創作室博客一起討論一下。
JUnit-addons
對JUnit的一些補充,比如設置、獲取被測試對象的私有屬性的值,調用被測試對象的私有方法等。
常用類:junitx.util.PrivateAccessor
Spring 測試框架
可以測試基於Spring的應用,通過配置文件和註解自動組裝需要的單元測試對象。
提供了一些常用的J2EE Mock對象,比如HttpSession的Mock類等。
可以支持資料庫自動回滾,以防止對資料庫的單元測試(插入,刪除等)不可重復執行,防止修改資料庫狀態等。
DJUnit
通過代碼自動產生Mock對象,省去了自己手動編寫N多的Mock類。
此外,它的Eclipse插件還可以做到測試覆蓋率、分支統計。
EasyMock
功能同DJUnit,也是通過編程自動Mock掉與測試對象無關的類,方法。
⑸ 求一篇新手學習Junit後的心得體會
不要用TestCase的構造函數初始化,而要用setUp()和tearDown()方法。
不要依賴或假定測試運行的順序,因為JUnit利用Vector保存測試方法。所以不同的平台會按不同的順序從Vector中取出測試方法。
避免編寫有副作用的TestCase。例如:如果隨後的測試依賴於某些特定的交易數據,就不要提交交易數據。簡單的回滾就可以了。
當繼承一個測試類時,記得調用父類的setUp()和tearDown()方法。
將測試代碼和工作代碼放在一起,一邊同步編譯和更新。
測試類和測試方法應該有一致的命名方案。如在工作類名前加上test從而形成測試類名。
確保測試與時間無關,不要依賴使用過期的數據進行測試。導致在隨後的維護過程中很難重現測試。
如果你編寫的軟體面向國際市場,編寫測試時要考慮國際化的因素。不要僅用母語的Locale進行測試。
盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡潔。
測試要盡可能地小,執行速度快。
⑹ spring測試事務回滾,拋出RuntimeException
請查看事務的配置是否正確,確認事務的界限是否配置到了想要的位置,
<aop:config>
<aop:pointcut id="bussinessService" expression="execution(public * 事務界限)"/>
<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice"/>
/aop:config>