04-JavaWeb Junit-配置文件与xml-文件 要点
Javaweb端的开发环境
idea:2019.3.5
JDK:11
软件生命周期
生命周期就是软件从立项到结束停用的过程
1. 软件项目的定义和规划: 确定开发目标和可行性研究报告
2. 需求分析: 对软件需要实现的功能进行分析.一般由策划部和研发部共同分析
3. 软件设计: 根据需求分析的结果,分模块,一般由研发部的架构师或者是项目经理设计
4. 程序编码: 在这个过程需要统一的规范.
5. 软件测试: 一般由研发部和测试部完成
6. 运行维护: 运行维护的时间占整个软件生命周期的80%
软件设计原则
软件设计原则是为了提高软件的开发效率 , 降低开发的成本
软件系统特点:
- 可重用性:应当DRY原则,减少重复代码
- 可拓展性:不改变软件现有的结构,也不影响已存在的模块,就可新增模块
- 可维护性:当需求发生改变的时候,只需要改变少量的代码
模块的要求:
- 结构稳定
- 可拓展性
- 可组合性
- 高内聚性
- 低耦合性
基本命名规范
多个字母使用驼峰命名法,见名知意,数字不能开头,由大小写字母,数字,下划线,$符号组成
包名: 全部小写 , 域名倒置+其他名,两个包之间用 . 隔开
接口名: 首字母用 I ,例如IUserArrays,I表示iterface,表示接口的意思,驼峰命名法
接口实现类: 命名末尾使用Impl结尾 , 表示为接口的实现类 , 例如UserArrayImpl;驼峰命名法
类名: 首字母大写 , 驼峰命名法
方法名: 首字母小写 , 驼峰命名法
变量名: 首字母小写 , 驼峰命名法
常量名: 全部大写 , 多个单词用_下划线隔开;适用于public static final 修饰的常量 : MAX_STOCK_COUNT
jar包
jar包相当于jdk,里面一般是封装好的工具类,如果需要导入jar包,一般创建一个lib包存放拷贝的jar包,如果需要使用该jar包需要 Add as Library。。
jar包导入
单元测试
黑盒测试
相当于把程序放入一个黑盒子中,输入什么应该输出什么,检查程序是否可以正常使用,一般由测试部门完成
黑盒测试不需要写代码
**作用:**是否有以下的错误:
- 界面是否有误;
- 输入和输出是否有问题;
- 数据库访问是否有问题;
- 性能是否有问题;
- 初始化和终止错误等。
白盒测试
需要写代码来测试,一般由开发人员测试
作用:
- 检查程序内部结构是否存在遗漏
- 功能是否完成
- 功能是否有错
- 是否按照规格说明书实现
JUnit
JUnit为白盒测试,一般使用Junit4.x
手动方法
前面以需要测试的类或接口名为头,以Test为结尾命名例如接口IUserDAO的测试类为UserDAO
注解应写上@Test
package cn.wolfcode.day01.test;
import org.junit.Test;
import static org.junit.Assert.*;
public class UserDAOTest {
// 注解一定要写上@Test
/**
@Test
public void 方法名(){
}
public : 公共的
void : 无返回
*/
@Test
public void add() {
}
@Test
public void delete() {
}
}
快捷方法
一般测试类需要一个统一的包test,并改为测试目录
快捷测试
Junit4:
配置文件
一般配置文件就是为了解决程序的硬编码问题
硬编码问题 : 当程序变量需要改变时 , 就需要改代码 , 工作量就会加大
如何解决硬编码问题 : 把需要修改的内容写在一个普通的文件中,让程序去读,程序只需要修改普通文件就好了
properties文件和XML文件
- 配置文件需要存放在resource包中 , 需创建
- 配置文件都是字符串,不需要使用引号
- 不需要使用空格
properties文件
properties文件又称为属性文件,以properties为后缀
存数据特点 : key=value 格式,多对数据使用换行分开
username=root
password=admin
如何解析properties文件?
1.使用Map方法
import java.io.*;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
File file = new File("E:\\idea-workspace\\day01_junit_xml\\resources\\db.properties");
InputStream inputStream = new FileInputStream(file);
Properties properties = new Properties();
// 读取流中的数据,并保存到properties对象中
properties.load(inputStream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("username = " + username);
System.out.println("password = " + password);
}
}
2.使用类加载器 , 直接从字节码的输出路径读取配置文件
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
public class DOMDemo {
/**
* 创建Document对象
* 1. 首先需要获取一个类加器
* 2. 通过类加载器 加载 字节码输出路径下面的资源文件
* 3. 先获取documentBuilderFactory 对象
* 4. 再获取documentBuilder 对象
* 5. 最后通过documentBuilder.parse(inputStream)方法获取document 对象
*
* 接口不能创建对象,可以去 同名+Builder工厂类 或者 同名+Factory 工厂类 中使用静态方法创建该实例
*/
public static void main(String[] args) throws Exception {
// 获取累加器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 通过类加载器 加载 字节码输出路径下面的资源文件
InputStream inputStream = classLoader.getResourceAsStream("contacts.xml");
// 获取documentBuilderFactory 对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获取documentBulider 对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 获取document 对象
Document document = documentBuilder.parse(inputStream);
// System.out.println("document = " + document);
}
XML文件
XML语法:
<?xml version="1.0" encoding="utf-8"?>
<!-- 以上文档声明,versino:版本,
encoding 编码格式:文档内容编码和文件本身编码必须保持一致-->
<根元素>
<a>a</a>
<b>b</b>
<c/>
<!-- -->
</根元素>
注意:
1.必须只能有一个根便签
2.不能交叉嵌套
3.注解使用 <!-- -->
4.<x>出现必有</x>
5.<x/>可以单独存在
6.<x id="1">标签可以有属性
7.严格区分大小写
8.<?xml version="1.0" encoding="utf-8"?>声明
9.<>表示元素/标签
XML结构:
<?xml version="1.0" encoding="utf-8"?>
<!-- 以上文档声明,versino:版本,
encoding 编码格式:文档内容编码和文件本身编码必须保持一致-->
<contacts>
<linkman id="1">
<name>小狼</name>
<email>wolf@wolfcode.cn</email>
<address>广州</address>
<group>Java学院</group>
</linkman>
<linkman id="2">
<name>小码</name>
<email>horse@520it.com</email>
<address>广州</address>
<group>Java学院</group>
</linkman>
</contacts>
层次结构整理:
XML的组成:
1.XML文件 : 用Document对象来描述
2.标签/元素 : 用Element对象来描述
3.属性 : 用Attribute来描述
4.文本 : 用Text类描述
Document,Element,Attribute,Text为Node子类
如何获取Document对象?
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
public class DOMDemo {
/**
* 创建Document对象
* 1. 首先需要获取一个类加器
* 2. 通过类加载器 加载 字节码输出路径下面的资源文件
* 3. 先获取documentBuilderFactory 对象
* 4. 再获取documentBuilder 对象
* 5. 最后通过documentBuilder.parse(inputStream)方法获取document 对象
*
* 接口不能创建对象,可以去 同名+Builder工厂类 或者 同名+Factory 工厂类 中使用静态方法
*/
public static void main(String[] args) throws Exception {
// 获取累加器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 通过类加载器 加载 字节码输出路径下面的资源文件
InputStream inputStream = classLoader.getResourceAsStream("contacts.xml");
// 获取documentBuilderFactory 对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获取documentBulider 对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 获取document 对象
Document document = documentBuilder.parse(inputStream);
// System.out.println("document = " + document);
}
如何获取联系人信息:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
public class DOMDemo {
/**
* 创建Document对象
* 1. 首先需要获取一个类加器
* 2. 通过类加载器 加载 字节码输出路径下面的资源文件
* 3. 先获取documentBuilderFactory 对象
* 4. 再获取documentBuilder 对象
* 5. 最后通过documentBuilder.parse(inputStream)方法获取document 对象
*
* 接口不能创建对象,可以去 同名+Builder工厂类 或者 同名+Factory 工厂类 中使用静态方法
*/
public static void main(String[] args) throws Exception {
// 获取累加器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 通过类加载器 加载 字节码输出路径下面的资源文件
InputStream inputStream = classLoader.getResourceAsStream("contacts.xml");
// 获取documentBuilderFactory 对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获取documentBulider 对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 获取document 对象
Document document = documentBuilder.parse(inputStream);
// System.out.println("document = " + document);
// 需求:获取第二个联系人名称
getLinkmanName(document);
}
/**
* 1. 首先根据document 对象获取根节点
* 2. 获取根节点下的linkman对象
* 3. 再获取linkman 对象 的第二联系人标签
* 4. 最后获取 name标签
*/
private static void getLinkmanName(Document document) {
// 根据document 对象获取根节点
Element rootEle = document.getDocumentElement();
// 获取下面的linkman标签
NodeList linkmans = rootEle.getElementsByTagName("linkman");
// 获取第二联系人标签
Element linkman = (Element) linkmans.item(1);
// 获取name 标签
Element nameEle = (Element) linkman.getElementsByTagName("name").item(0);
String textContent = nameEle.getTextContent();
System.out.println("textContent = " + textContent);
}
}
如何获取添加一个联系人信息?
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.concurrent.TransferQueue;
public class DOmDemo02 {
public static void main(String[] args) throws Exception {
// 获取累加器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 通过类加载器 加载 字节码输出路径下面的资源文件
InputStream inputStream = classLoader.getResourceAsStream("contacts.xml");
// 获取documentBuilderFactory 对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获取documentBulider 对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 获取document 对象
Document document = documentBuilder.parse(inputStream);
// System.out.println("document = " + document);
// 需求:添加一个联系人信息
addLinkmanInfo(document);
}
/**
* <linkman id="1">
* <name>小狼</name>
* <email>wolf@wolfcode.cn</email>
* <address>广州</address>
* <group>Java学院</group>
* </linkman>
* @param document
*
* 1. 首先查找document的根节点
* 2. 创建标签对象
* 3. 添加其属性
* 4. 设置文本信息
* 5. 关联联系人
* 6. 添加联系人
* 7. 同步document 的内容到xml文件中
*/
private static void addLinkmanInfo(Document document) throws TransformerException, FileNotFoundException {
// 1. 首先查找document的根节点
Element documentElement = document.getDocumentElement();
// 2. 创建标签对象
Element linkman = document.createElement("linkman");
// 3. 添加标签对象的属性
linkman.setAttribute("id","3");
Element name = document.createElement("name");
Element email = document.createElement("email");
Element address = document.createElement("address");
Element group = document.createElement("group");
// 4. 设置标签对象的文本信息
name.setTextContent("小狼");
email.setTextContent("wolf@wolfcode.cn");
address.setTextContent("广州");
group.setTextContent("Java学院");
// 5. 关联联系人
linkman.appendChild(name);
linkman.appendChild(email);
linkman.appendChild(address);
linkman.appendChild(group);
// 6. 添加联系人
documentElement.appendChild(linkman);
// 7. 同步document 的内容到XML 文件中
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream(new File("E:\\idea-workspace\\day01_junit_xml\\out\\production\\day01_junit_xml\\contacts.xml"))));
}
}
linkman.appendChild(email);
linkman.appendChild(address);
linkman.appendChild(group);
// 6. 添加联系人
documentElement.appendChild(linkman);
// 7. 同步document 的内容到XML 文件中
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream(new File("E:\\idea-workspace\\day01_junit_xml\\out\\production\\day01_junit_xml\\contacts.xml"))));
}
}