【Java 强化】单元测试,linux 驱动开发入门与实战 pdf
断言失败: 期望值和真实值不同,此时显示红条。
断言:
Assert.assertEquals(message, expected, actual)
:比较的值
message:断言失败的提示信息,断言成功不会显示
expected:期望值
actual:真实值
若真实值和期望值想等,则断言成功 —> 绿条
Assert.assertSame(message, expected, actual)
:比较地址,断言是同一个对象
Assert.assertNotSame(message, expected, actual)
:断言不是同一个对象
Assert.assertTrue(message, condition)
:断言 condition 应该为 TRUE
Assert.assertFalse(message, condition)
:断言 condition 应该为 FALSE
Assert.assertNull(message, object)
:断言对象 object 为 null
Assert.assertNotNull(message, object)
:断言对象 object 不为 null
@Test(expected=ArithmeticException.class)
:期望该方法抛出ArithmeticException
异常@Test(timeout=400)
:期望该方法在 400 毫秒之内执行完成
示例:利用断言进行对数学方法类进行测试。
package com.yusael._01_junit.asserted;
/**
数学运算功能
@author yusael
*/
public interface IMath {
/**
两个数相加
@param a 加数
@param b 加数
@return 两个数之和
*/
int add(int a, int b);
/**
两个数之商(考虑整除)
@param a 被除数
@param b 除数
@return 商
*/
int divide(int a, int b);
}
package com.yusael._01_junit.asserted.impl;
import com.yusael._01_junit.asserted.IMath;
public class MathImpl implements IMath {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int divide(int a, int b) {
return a / b;
}
}
package com.yusael._01_junit.asserted;
import org.junit.Test;
import com.yusael._01_junit.asserted.impl.MathImpl;
import junit.framework.Assert;
// Math 测试类
public class MathTest {
// 依赖关系
private IMath math = new MathI
mpl();
@Test
public void testAdd() {
int ret = math.add(1, 2);
Assert.assertEquals(3, ret);
}
@Test
public void testDivide() {
int ret = math.divide(6, 2);
Assert.assertEquals(3, ret);
}
// 期望抛出 ArithmeticException 异常, 不抛则测试不通过
@Test(expected=ArithmeticException.class)
public void testException() {
math.divide(2, 0); // 抛出 ArithmeticException 异常, 测试通过
}
}
===========================================================================
XML(eXtensible Markup Language),是一种可扩展的标记语言,类似 HTML。
XML 技术是 W3C 组织(World Wide Web Consortium 万维网联盟)发布的,目前遵循的是 W3C 组织于 2000 年发布的 XML1.0 规范。
XML 被广泛认为是继 Java 之后在 Internet 上最激动人心的新技术。
XML 的树状结构简单,清晰,无论是人还是计算机都能轻松解析。
XML 作为一种公订的、开放的标准,不受知识产权的限制。
HTML: 显示页面,网页. 学习里面自带的标签
XML: 传输数据,而非显示数据。
XML 标签没有被预定义,需要用户自行定义标签。
为什么要学 XML:
XML 是一种通用的数据交换格式;
许多项目都采用 XML 作为数据交换格式;
掌握 XML 是软件开发人员的一项基本技能;
Struts、Spring、Hibernate、Mybatis 等任意一个 Java EE 框架中都可用 XML 做配置文件。
XML 有两个编码: 内容编码、文件本身的编码;要保证两个编码相同,都为 UTF-8。
一个 XML 文档必须有且仅有一个根标签,不允许标签嵌套,区分大小写。
在编写 XML 文档时,
需要先使用文档声明来声明 XML 文档,且必须出现在文档的第一行。
最简单的语法,如:<?xml version="1.0"?>
用
encoding
属性说明文档所使用的字符编码,默认为 UTF-8。
保存在磁盘上的文件编码要与声明的编码一致。
如:<?xml version="1.0" encoding="UTF-8"?>
用
standalone
属性说明文档是否独立,即是否依赖其他文档。
如:<?xml version=”1.0” standalone=”yes”?>
CDATA
是 Character Data 的缩写:
作用:把标签当做普通文本内容;
解析器不对 CDATA
区中的内容进行解析,而是将这些数据原封不动地交给程序去处理。
语法:
<![CDATA[数据内容]]>
xml 一般情况下不会要求去写,大致看得懂即可。
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<linkman id="1">
<name>Will</name>
<email>iwiller@qq.com</email>
<address>成都</address>
<group>叩丁狼教育</group>
</linkman>
<linkman id="2">
<name>Stef</name>
<email>lanyotech@qq.com</email>
<address>成都</address>
<group>叩丁狼教育</group>
</linkman>
</contacts>
======================================================================
DOM(Document Object Model):文档对象模型
使用面问对象的方式,把 XML 文件中的结构使用对象来表示。
在 XML 中,一切皆节点(Wode)。
Node:节点
Document:文档节点(XML 文件)
Element:元素节点(使用 <> 表示标签)
Attribute:属性节点(元素上属性名 = “属性值”)
Text:文本节点(元素之间的内容)
DOM(Document Object Model):文档对象模型
使用面问对象的方式,把 XML 文件中的结构使用对象来表示。
使用 Java 代码操作 XML
使用 JavaScript 操作 HTML
特点:
在加载的时候,一次性把整个 XML 文档加载进内存,在内存中形成一颗树对象(Document )。
我们以后使用代码操作 Document,其实操作的是内存中的 DOM 树;和本地磁盘中的 XML 文件没有直接关系。
比如:我保存了一个联系人,仅仅是内存中多了一个联系人,但是在 XML 文件中没有新增的痕迹。除非做 同步操作:把内存中的数据更新到 XML 文件。( 增删改操作完之后,都需要做同步操作。)
缺点:若 XML 文件过大,可能造成内存溢出。
获取 Document 文档对象:
package com.yusael._03_dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
// DOM 操作测试类
public class DOMTest {
private File f = new File("F:/java/JavasePro/JUnit-XML-DOM-DOM4J/contacts.xml");
// 如何获取 Document 文档对象
@Test
public void testGetDocument() throws Exception {
// 1):创建 DocumentBuilderFactory 对象(意识:工厂类中一般都有一个静态方法用于返回当前工厂类对象)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2):根据工厂对象, 创建 DocumentBuilder 对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3):根据 builder 对象去解析一个已经存在的 XML 文件, 从而得到 Document 对象.
Document doc = builder.parse(f); // [#document: null]
}
}
根据 DocumentBuilder
创建 Document
对象,有两种方式:
当 XML 文档不存在时,使用
newDocument()
,在内存中先创建出一颗 树对象(Document)。
Document doc=builder.newDocument();
当 XML 文档存在时,我们只需要直接解析即可。
Document doc = builder.parse(File 对象);
什么是解析(parse):一般而言,把使用 String 描述的事物,转换为描述该事物的类型。
// 解析时间
Date d = DateFormat 对象.parse("2018-10-10");
操作步骤:
获取
Document
文档对象获取 XML 中的根元素
contacts
获取第二个联系人元素
linkman
获取
linkman
元素下的name
子元素获取
name
元素的文本内容
// 需求 1、得到某个具体的文本节点的内容:取出第二个联系人的名字.
@Test
public void test1() throws Exception {
// 1):获取 Document 文档对象.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
// 2):获取 XML 中的根元素(contacts).
Element root = doc.getDocumentElement();
// 3):获取第二个联系人元素(linkman).
Element linkmanEl = (Element)root.getElementsByTagName("linkman").item(1);
// 4):获取 linkman 元素下的 name 子元素.
Element nameEl = (Element)root.getElementsByTagName("name").item(0);
// 5):获取 name 元素的文本内容.
System.out.println(nameEl.getTextContent());
}
操作步骤:
获取
Document
文档对象获取 XML 中的根元素
contacts
获取第一个联系人元素
linkman
获取
linkman
元素下的email
子元素设置
email
元素的新的文本内容will@
同步操作:把内存中的数据同步更新到磁盘的 XML 中
核心类:Transformer
// 需求 2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉.
@Test
public void test2() throws Exception {
// 1):获取 Document 文档对象.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
// 2):获取 XML 中的根元素(contacts).
Element root = doc.getDocumentElement();
// 3):获取第一个联系人元素(linkman).
Element linkmanEl = (Element)root.getElementsByTagName("linkman").item(0);
// 4):获取 linkman 元素下的 email 子元素.
Element emailEle = (Element)linkmanEl.getElementsByTagName("email").item(0);
// 5):设置 email 元素的新的文本内容(will@).
emailEle.setTextContent("will@");
// 6):同步操作:把内存中的数据同步更新到磁盘的 XML 中.核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
Source xmlSource = new DOMSource(doc); // 源: 内存中的 Document 对象
Result outputTarget = new StreamResult(f); // 目标: 磁盘中的 XML 文件(contacts.xml)
trans.transform(xmlSource, outputTarget); // 同步操作
}
操作步骤:
获取
Document
文档对象获取 XML 中的根元素
contacts
创建一个
linkman
元素的片段创建
linkman
、name
、email
、address
、group
元素给
name
、email
、address
、group
元素设置文本内容把
name
、email
、address
、group
元素作为linkman
元素的子元素把
linkman
元素作为根元素的子元素同步操作:把内存中的数据同步更新到磁盘的 XML 中
核心类:Transformer.
// 需求 3,向指定元素节点中增加子元素节点:增加一个新的联系人信息.
@Test
public void test3() throws Exception {
// 1):获取 Document 文档对象.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
// 2):获取 XML 中的根元素(contacts).
Element root = doc.getDocumentElement();
// -----------------------------------------------------
// 3):创建一个 linkman 元素的片段.
// 3.1):创建 linkman,name,email,address,group 元素
Element linkmanEl = doc.createElement("linkman");
Element nameEl = doc.createElement("name");
Element emailEl = doc.createElement("email");
Element addressEl = doc.createElement("address");
Element groupEl = doc.createElement("group");
// 3.2):给 name,email,address,group 元素设置文本内容
linkmanEl.setAttribute("id", "3"); // linkman 设置 id 属性
nameEl.setTextContent("yusael");
emailEl.setTextContent("yusael@qq.com");
addressEl.setTextContent("苏州");
groupEl.setTextContent("HELLO");
// 3.3):把 name,email,address,group 元素作为 linkman 元素的子元素.
linkmanEl.appendChild(nameEl);
linkmanEl.appendChild(emailEl);
linkmanEl.appendChild(addressEl);
linkmanEl.appendChild(groupEl);
// 3.4):把 linkman 元素作为根元素的子元素
root.appendChild(linkmanEl);
// -----------------------------------------------------
// 4):同步操作:把内存中的数据同步更新到磁盘的 XML 中.核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
操作 XML 元素属性:设置/获取第三个联系人的 id 属性
操作步骤:
获取
Document
文档对象获取 XML 中的根元素
contacts
获取第三个联系人元素
linkman
获取
linkman
元素下的id
属性值 / 设置linkman
元素的id
属性值.同步操作:把内存中的数据同步更新到磁盘的 XML 中
核心类:Transformer
如果是获取属性,是不需要同步操作的;如果是设置属性需要同步操作。
// 需求 4、操作 XML 元素属性:设置/获取第三个联系人的 id 属性.
@Test
public void test4() throws Exception {
// 1):获取 Document 文档对象.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
// 2):获取 XML 中的根元素(contacts).
Element root = doc.getDocumentElement();
// 3):获取第三个联系人元素(linkman).
Element linkmanEl = (Element)root.getElementsByTagName("linkman").item(2);
// -----------------------------------------------------
// 4):获取 linkman 元素下的 id 属性/设置 linkman 元素的 id 属性值.
linkmanEl.setAttribute("id", "3"); // 设置第 3 个人的 id 为 3
String id = linkmanEl.getAttribute("id"); // 获取第 3 个人的 id
// -----------------------------------------------------
// 5):同步操作:把内存中的数据同步更新到磁盘的 XML 中.核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
操作步骤:
获取
Document
文档对象获取 XML 中的根元素
contacts
获取第三个联系人元素
linkman
删除第三个
linkan
元素.(请自己的老爸来干掉自己)同步操作:把内存中的数据同步更新到磁盘的 XML 中
核心类:Transformer
// 需求 5、删除指定元素节点:删除第三个联系人信息.
@Test
public void test5() throws Exception {
// 1):获取 Document 文档对象.
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
// 2):获取 XML 中的根元素(contacts).
Element root = doc.getDocumentElement();
// 3):获取第三个联系人元素(linkman).
Element linkmanEl = (Element)root.getElementsByTagName("linkman").item(2);
// -----------------------------------------------------
// 4):删除第三个 linkan 元素.(请自己的老爸来干掉自己)
// root.removeChild(linkmanEl);
linkmanEl.getParentNode().removeChild(linkmanEl);
// -----------------------------------------------------
// 5):同步操作:把内存中的数据同步更新到磁盘的 XML 中.核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
// 需求 6、在内存中创建一个 Document 对象。
@Test
public void test6() throws Exception {
// 1):获取 Document 文档对象.
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = null;
// 如果 XML 存在,则解析,否则创建新的
if (f.exists()) {
doc = builder.parse(f);
} else {
doc = builder.newDocument();
// 创建根元素, 并把根元素作为文档的子元素
doc.appendChild(doc.createElement("contacts"));
}
// 执行操作
// ......
// 同步操作
// ......
}
========================================================================
dom4j 是一个 Java 的 XML API,是 jdom 的升级品,用来读写 XML 文件的。dom4j 是一个十分优秀的 JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过 sun 公司官方的 dom 技术,同时它也是一个开放源代码的软件,可以在 SourceForge 上找到它。在 IBM developerWorks 上面还可以找到一篇文章,对主流的 Java XML API 进行的性能、功能和易用性的评测,所以可以知道 dom4j 无论在哪个方面都是非常出色的。如今可以看到越来越多的 Java 软件都在使用 dom4j 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 dom4j。这已经是必须使用的 jar 包, Hibernate 也用它来读写配置文件。
简而言之:比官方的 DOM 更牛逼! 以后操作 XML 使用这个就可以了,上面的 DOM 了解一下,会了 DOM,DOM4J 用起来更方便。
下面的示例就是一些很基础常用的 demo,体验一下,开发中还是要去看文档。
评论