写点什么

【Java 强化】单元测试,linux 驱动开发入门与实战 pdf

用户头像
极客good
关注
发布于: 刚刚

断言失败: 期望值和真实值不同,此时显示红条。


断言


  • 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


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


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 以及约束


===========================================================================


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 语法




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>


DTD 约束(了解)





Scheme 约束(了解)





DOM


======================================================================


DOM(Document Object Model):文档对象模型


  • 使用面问对象的方式,把 XML 文件中的结构使用对象来表示。


在 XML 中,一切皆节点(Wode)。


  • Node:节点

  • Document:文档节点(XML 文件)

  • Element:元素节点(使用 <> 表示标签)

  • Attribute:属性节点(元素上属性名 = “属性值”)

  • Text:文本节点(元素之间的内容)




获取 Document 文档对象




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");


得到某个具体的文本节点的内容:取出第二个联系人的名字




操作步骤:


  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第二个联系人元素 linkman

  4. 获取 linkman 元素下的 name 子元素

  5. 获取 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());


}


修改某个元素节点的主体内容:把第一个联系人的邮箱改掉




操作步骤:


  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第一个联系人元素 linkman

  4. 获取 linkman 元素下的 email 子元素

  5. 设置 email 元素的新的文本内容 will@

  6. 同步操作:把内存中的数据同步更新到磁盘的 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); // 同步操作


}



向指定元素节点中增加子元素节点:增加一个新的联系人信息




操作步骤:


  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 创建一个 linkman 元素的片段

  4. 创建 linkmannameemailaddressgroup 元素

  5. nameemailaddressgroup 元素设置文本内容

  6. nameemailaddressgroup 元素作为 linkman 元素的子元素

  7. linkman 元素作为根元素的子元素

  8. 同步操作:把内存中的数据同步更新到磁盘的 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 属性




操作步骤:


  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第三个联系人元素 linkman

  4. 获取 linkman 元素下的 id 属性值 / 设置 linkman 元素的 id 属性值.

  5. 同步操作:把内存中的数据同步更新到磁盘的 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));


}


删除指定元素节点:删除第三个联系人信息.




操作步骤:


  1. 获取 Document 文档对象

  2. 获取 XML 中的根元素 contacts

  3. 获取第三个联系人元素 linkman

  4. 删除第三个 linkan 元素.(请自己的老爸来干掉自己)

  5. 同步操作:把内存中的数据同步更新到磁盘的 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));


}


在内存中创建一个 Document 对象




// 需求 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


========================================================================


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,体验一下,开发中还是要去看文档。


查询所有联系人的信息




用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Java 强化】单元测试,linux驱动开发入门与实战pdf