注解測試XML
1. 什么是注解
所有的Annotation都是java.lang.annotation.Annotation接口的子接口姿锭,所以Annotation是一種特殊的接口(枚舉是特殊的類);
@interface Override{} ---> interface Override extends java.lang.annotation.Annotation{}
所有的枚舉類购披,都是java.lang.Enum類的子類涡扼。
enum Gender{} ---> class Gender extends java.lang.Enum{}
注解被用來為程序元素(類苛吱,方法成員變量等)設(shè)置元數(shù)據(jù)吹泡。
注解骤星,標(biāo)簽,Annotation都是一體爆哑。
使用注解需要三方面的參與
1.要有一個注解
2.被貼的程序元素
3.需要第三方程序參數(shù)洞难,賦予注解特殊的功能
注解:主要是用來描述程序元素,和xml的功能是一樣的,都是用來實現(xiàn)配置信息
2.JDK中內(nèi)置的注解
常用注解:
@Override 限定重寫父類的方法
@Deprecated 標(biāo)記已過時的成員揭朝,不推薦使用
@SuppressWarings 抑制編譯器發(fā)出的警告代碼的問題任然存在队贱,只是把警告消除了而已**
@SafeVarargs 抑制堆污染警告(JAVA7開始出現(xiàn)的)堆污染:當(dāng)方法中有泛型和可變參數(shù)的時候色冀,可能出現(xiàn)堆污染警告
3. JDK中的元注解
注解:描述數(shù)據(jù)的數(shù)據(jù)
元注解:描述注解的注解
@Retention 表示注解可以保存在哪一個時期,保存的時期值封裝在RetentionPolicy枚舉類中柱嫌,第三方的程序通常是使用反射(在運行時期生效)來賦予特殊的功能锋恬,如果注解都不能保存到運行時期,那么反射是獲取不到對應(yīng)的注解编丘。
@Target 表示注解可以貼在哪些位置(類与学,方法,構(gòu)造器等等).位置的常量封裝在ElementType枚舉類中**
enum ElementType {
ElementType.ANNOTATION_TYPE // 只能修飾Annotation
ElementType.CONSTRUCTOR // 只能修飾構(gòu)造器方法
ELementType.FIELD // 只能修飾字段(屬性)嘉抓,包括枚舉常量
ElementType.LOCAL_VARIABLE // 只能修飾局部變量
ElementType.METHOD // 只能修飾方法
ELementType.PACKAGE // 只能修飾包(極少使用)
ElementType.PARAMETER // 只能修飾參數(shù)
ElementType.TYPE // 只能修飾類癣防,接口,枚舉
}
@Documented 使用@Document標(biāo)注的標(biāo)簽會保存到API文檔中掌眠。
@Inherited 標(biāo)注的標(biāo)簽可以被子類繼承
Java代碼中的三種狀態(tài)
Java代碼的三種狀態(tài)詳解
4.自定義注解
@Target({ ElementType.TYPE, ElementType.METHOD }) // 可以使用在類蕾盯,接口,枚舉蓝丙,以及方法
@Retention(RetentionPolicy.RUNTIME) // 保存到運行時
public @interface MyAnno {
String value();
int age() default 18;
Gender sex() default Gender.OTHER;
}
注意:
**
1.注解中屬性的類型:
**
基本數(shù)據(jù)類型级遭,String,Class渺尘,注解挫鸽,枚舉,一位數(shù)組
**2.注解中如果需要給value屬性傳值鸥跟,那么可以省略掉value(前提是只有value這么一個屬性)
**
5.注解的定義和使用
1.定義注解:
@Target(ElementType.Type) // 表明只能貼在類丢郊,接口或者枚舉中
@Retention(RetentionPolicy.RUNTIME) // 表明存在的時期,是在Runtime的時候
public @interface 注解名 {
String value(); // 必須使用抽象方法医咨,在直接中枫匾,我們稱之為屬性,屬性使用名詞表示
int age() default 18; // 設(shè)置默認(rèn)值
}
注意:
數(shù)據(jù)只能是:基本數(shù)據(jù)類型拟淮,String干茉,Class,Annotation很泊,Enum角虫,數(shù)組
2.使用注解:
@注解名詞,但是上面那個只能貼在Target所規(guī)定的范圍中
3.獲取注解:
因為注解可以貼在類委造,構(gòu)造器戳鹅,方法,字段等上面昏兆。所以可以在Class,Constructor,Field,Method類中枫虏,有操作注解相關(guān)的方法:
public boolean isAnnotationPresent(Class annotationClass); // 判斷該成員上是否有指定的注解標(biāo)注。
public Annotation getAnnotation(Class annotationClass); // 獲取該成員上的指定的注解
public Annotation[] getAnnotation(); // 獲取該成員上所有的注解
示例代碼
@MyAnno(value = "Frank", age = 18)
public class MyAnnoDemo {
public static void main(String[] args) {
// 獲取到MyAnnoDemo類的字節(jié)碼對象
Class clz = MyAnnoDemo.class;
// 判斷當(dāng)前類上是否有MyAnno注解
if (clz.isAnnotationPresent(MyAnno.class)) {
Annotation annotation = clz.getAnnotation(MyAnno.class);
// 可以直接強轉(zhuǎn)一下
MyAnno anno = (MyAnno) annotation;
System.out.println(anno.value());
System.out.println(anno.age());
System.out.println(anno.sex());
}
}
}
注意:MyAnno記得加上Retention(RetentionPolicy.RUNTIME),否則運行之后就沒有注釋效果了
6.單元測試
黑盒測試
只檢查程序功能是否按照<u>需求規(guī)格說明</u>的規(guī)定正常使用模软,程序是否能適當(dāng)?shù)亟邮?lt;u>輸入數(shù)據(jù)</u>而昌盛正確的<u>輸出信息</u>
白盒測試
按照程序內(nèi)部的結(jié)構(gòu)測試程序伟骨,通過測試來檢測產(chǎn)品內(nèi)部動作是否按照<u>設(shè)計規(guī)格說明書</u>的規(guī)定正常進(jìn)行
7.Junit3.x測試環(huán)境搭建
步驟:
1.導(dǎo)入Junit3.x的jar包
2.創(chuàng)建一個測試類JUnit3Test,繼承TestCast類
3.定義一個測試方法(替代了以前的main方法)
要求:必須是公共的燃异,無法回值携狭,方法名稱必須是test為前綴,無參數(shù)回俐。
4.在測試方法之前逛腿,執(zhí)行初始化操作(這種代碼只需要寫一次)
5.在測試方法之后,執(zhí)行資源銷毀操作(這種代碼只需要寫一次)
6.快速生成測試方法:
輸入test3仅颇,代碼提示单默,回車
8.Junit4.x測試環(huán)境搭建
//1.導(dǎo)入Junit4.x的jar包
//2.創(chuàng)建一個測試類JUnit4Test
//3.定義一個測試方法(替代了以前的主方法main)
// 要求:必須是公共的,無返回值忘瓦,無參數(shù)搁廓。
//4.在測試方法之前,執(zhí)行了初始化操作(這種代碼只需要寫一次)
//5.在測試方法之后耕皮,執(zhí)行資源銷毀操作(這種代碼需要寫一次)
//6.快速生成測試方法:輸入test境蜕,代碼提示,回車
//7.在執(zhí)行所有的測試方法之前需要執(zhí)行一次(方法必須是靜態(tài)的)
@BeforClass
public static void first() {
System.out.println("在最開始的時候執(zhí)行一次");
}
//8.在執(zhí)行的所有測試方法之后需要執(zhí)行一次(方法必須是靜態(tài)的)
@AfterClass
public static void end() {
System.out.println("在最后的時候執(zhí)行一次");
}
9.使用斷言做測試
測試的步驟
1.定義一個接口:IMath
2.定義一個IMath的實現(xiàn)類:MathImpl
3.完成測試代碼
4.完成實現(xiàn)類
使用 <u>斷言</u> 做測試
核心類:Assert
斷言需要:期望值凌停,真實值
在Eclipse中粱年,斷言成功,使用綠條表示罚拟,反之使用紅條台诗。
Assert.assertEquals(message, expected, actual);
// message : 斷言失敗的提示信息,成功不會提示
// expected : 期望值
// actual : 真實值
10.XML
定義
XML赐俗,是一種可擴(kuò)展的標(biāo)記語言拉队。
在編寫XML文檔時,需要先使用文檔聲明來聲明xml文檔秃励。并且必須出現(xiàn)在文檔的第一行
<?xml version="1.0"?>
11.獲取Document對象
獲取Document對象的步驟:
// 1.確定文件的位置
File file = new File("文件的絕對路徑");
// 2.創(chuàng)建DocumentBuilderFactory工程類的對象(工廠類中往往體現(xiàn)著單例模式)
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
// 3.通過工廠類對象創(chuàng)建DocumentBuilder對象
DocumentBuilder builder = fac.newDocumentBuilder();
// 4.通過DocumentBuilder對象創(chuàng)建Document對象
Document doc = builder.parse(file);
12.使用DOM讀取XML中的信息
// 獲取到需要解析的XML文件
File file = new File("contracts.xml");
// 獲取到Document對象用來解析XML文件
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
// 直接讀取到文件中的linkman節(jié)點
NodeList linkmanList = doc.getElementsByTagName("linkman");
// 使用循環(huán)遍歷linkmanList中的東西
for (int i = 0 ; i < linkmanList.getLength(); i++) {
// 這里直接強轉(zhuǎn)成Element氏仗,因為上面使用的是getElements吉捶,實際上是要使用Element.getAttribute的方法
Element ele = linkmanList.item(i);
// 輸出第一個聯(lián)系人的id
System.out.println("第一個聯(lián)系人的id-->" + ele.getAttribute("id"));
// 繼續(xù)遍歷該聯(lián)系人下的name,email,address,group屬性
// 使用getChildNodes()方法
NodeList childNodes = item.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
// 遍歷里面的Nodes
Node node = childNodes.item(j);
// 對每個Node的類型進(jìn)行判斷夺鲜,如果是ELEMENT_NODE(元素節(jié)點),就是我們要找的
if (node.getNodeType == Node.ELEMENT_NODE) {
// 強轉(zhuǎn)一下呐舔,因為要獲取到節(jié)點中的內(nèi)容
Element ele = (Element) node;
// 判斷這個節(jié)點名稱是什么name,email,address,group
if (ele.getNodeName().equals("name")) {
System.out.println("聯(lián)系人的姓名-->" + ele.getTextContent());
} else if (ele.getNodeName.equals("email")) {
System.out.println("聯(lián)系人的郵箱-->" + ele.getTextContent());
}
// ... 剩下的address,group就不在過多的演示了
}
}
}