Maven-15使用Maven進行測試

 

轉載原文出處:http://suhuanzheng7784877.iteye.com/blog/1082339

1.  測試簡介

這裏所說的測試主要是指單元測試,一般說Java的單元測試都知道有個Junit。確實目前很多公司,無論什麼行業,基本都是使用junit進行單元測試,一般銀行、電信、股票項目每個功能類都必須有相應的單元測試類,而且測試用例也是極其苛刻的。而且每一行代碼都需要有log追蹤。生成的測試報告也要成爲相應的成果物交與甲方。稍微差一點的,單元測試也就是一個形式,因爲很多情況(由以國內政務項目爲主)都是業務邏輯集成UI功能都做完了,之後再回去補單元測試,其實是爲了應付甲方合同中的測試報告。話說多了,偏離了主題。Maven構建項目的時候可以執行我們的單元測試,底層是調用了Maven的插件maven-surefire-plugin執行單元測試用例。

2.  新模塊的需求與開發

再展示Maven的測試功能之前,我們先來開發一個新的模塊,隨機驗證碼的功能模塊。隨機驗證碼我們在網上都用過,在此不再詳細說了,直接看代碼即可。此處用到了一個google開源的組件。這個在筆者的另一篇blog

http://suhuanzheng7784877.iteye.com/blog/1076066中有介紹,在此不再贅述。

先來看生成隨機數業務代碼

AccountImageUtil

 
package com.liuyan.account.mail;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Random;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;

public class AccountImageUtil {

	static DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
	static Map<Integer, String> map;
	static int key = 0;
	static Random random;
	static {
		defaultKaptcha.setConfig(new Config(new Properties()));
		map = new HashMap<Integer, String>();
		random = new Random();
	}

	public static String generateText() {
		StringBuffer sb = new StringBuffer();

		for (int i = 0; i < 4; i++) {
			int a = random.nextInt(10);
			sb.append(a);
		}
		map.put(key, sb.toString());
		key++;
		return sb.toString();
	}

}
 以上業務輔助類初始化了圖片生成組件,之後調用隨機函數類生成四位的隨機數。

再來看看生成圖片的類AccountImageServiceImpl,接口不再給出了

package com.liuyan.account.mail;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

public class AccountImageServiceImpl implements AccountImageService {

	@Override
	public byte[] generateText() {

		BufferedImage bufferedImage = AccountImageUtil.defaultKaptcha
				.createImage(AccountImageUtil.generateText());

		ByteArrayOutputStream out = new ByteArrayOutputStream();

		try {
			ImageIO.write(bufferedImage, "jpg", out);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		File file = new File("c:/1.jpg");
		try {
			FileOutputStream fileOut = new FileOutputStream(file);
			fileOut.write(out.toByteArray());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return out.toByteArray();

	}

	public String getText(Integer key) {
		String value = AccountImageUtil.map.get(key);
		return value;
	}

	@Override
	public boolean validateText(Integer key, String text) {

		String value = AccountImageUtil.map.get(key);

		return value.equals(text);
	}
}

 這個類就是調用輔助類生成圖片的。下面我們編寫單元測試。

3.  新模塊的測試

AccountImageUtilTest代碼如下

package com.liuyan.account.mail;
import static org.junit.Assert.assertFalse;
import org.junit.Test;

public class AccountImageUtilTest {

	@Test
	public void testGenerateText() {
		String value = AccountImageUtil.generateText();
		assertFalse("1111".equals(value));
	}

}

 AccountImageServiceImplTest如下

package com.liuyan.account.mail;
import static org.junit.Assert.*;
import org.junit.Test;
public class AccountImageServiceImplTest {

	AccountImageServiceImpl accountImageServiceImpl = new AccountImageServiceImpl();

	@Test
	public void testGenerateText() {

		byte[] b = accountImageServiceImpl.generateText();

		assertTrue(b != null);

	}

	@Test
	public void testValidateText() {
		String text = accountImageServiceImpl.getText(0);
		System.out.println("---------------------------------" + text);
		assertTrue(!text.equals("0000"));
	}

}

 之後在控制檯運行如下指令

mvn test

 之後效果如下

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.liuyan.account.mail.AccountImageServiceImplTest
---------------------------------1990
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.926 sec
Running com.liuyan.account.mail.AccountImageUtilTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

 運行報告是junit自己的報告輸出,和咱們在Eclipse運行的報告差不多。以上代表運行了3個用例,和預期效果不符的是0個,失敗的用例是0個,忽略的用例數是0個。

如果需要跳過單元測試,則可以運行如下命令

mvn package -DskipTests

 大家可能要問,爲何Maven能夠自己尋找我們編寫的測試類呢?其實還是那句約定大於配置。Maven自動去尋找src/test/java下面的類,當此文件夾下面的類符合以下規範,那麼Maven默認認爲他們是單元測試用例類。

Test*.java:任何目錄下以Test爲開始的類

*Test.java: 任何目錄下以Test爲結尾的類

*TestCase.java: 任何目錄下以TestCase爲結尾的類。

如果想在一段時間內節省項目構建時間,暫時全部忽略單元測試。那麼可以在pom.xml中配置如下

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>
	</build>

 等到項目完全開發完了,需要測試用例的時候將其註釋掉即可。

本個模塊有兩個測試用例類,如果僅僅想運行一個測試用例該怎麼辦。運行下面命令

test -Dtest=AccountImageServiceImplTest

 這個是指定具體運行哪個測試用例。當然需要將pom文件中忽略測試用例的配置註釋掉。

也可以測試多個測試用例

mvn test -Dtest=AccountImageServiceImplTest,AccountImageUtilTest

也可以使用模糊匹配進行測試

mvn test -Dtest=*Test
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<includes>
						<include>**/*Test.java</include>
					</includes>
					<excludes>
						<exclude>**/AccountImageUtilTest.java</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

 includes是需要測試的類,excludes是要排除之外測試用例。可以使用模糊匹配。**用來匹配任意件路經,*匹配任意類。

4.  測試報告

基本的測試報告上面已經介紹過了,下面我們看看測試覆蓋率的報告。運行如下命令

mvn cobertura:cobertura

 target文件夾下出現了一個site目錄,下面是一個靜態站點,裏面就是單元測試的覆蓋率報告。



 

5.  總結

這次我們介紹了Maven的測試,可以運行項目的單元測試用例,並生成報告。使用者可以根據自己的需要配置測試選項以滿足項目的測試需求。最後說一下,測試十分重要,往往大手筆的產品測試人員和開發人員的比例是2:1

發佈了55 篇原創文章 · 獲贊 14 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章