Junit与XML
软件的生命周期和设计原则
生命周期
软件生命周期可以分为6个阶段
- 项目开始规划,定义:确定软件开发的目标与可行性
- 需求分析:对软件需要实现的功能进行需求分析
- 软件设计:设计每一个模块的结构,搭建整体框架
- 代码编写:代码编写实现部分
- 软件测试:对代码进行软件测试(白盒,黑盒)
- 运行维护:软件生命周期最长的一部分,对开发的软件进行定期维护
设计原则
- 可重用性 :遵循DRY(Don’t Repeat Yourself)原则
- 可拓展性
- 可维护性
模块要求
- 结构稳定
- 可拓展性
- 可组合性
- 高内聚:强调一个系模块中,每个模块值完成特定的功能,不同模块间不会有功能重叠
- 低耦合:强调每个模块间相互独立
编写代码遵循基本命名规范
基本命名规范:驼峰法
-
包名:采用倒置域名: cn.k.crm.util
-
接口名:IXxx
-
接口实现类:Imlp结尾, XxxxImpl
-
类名:首字母大写,名词,驼峰法
-
方法名,变量名:首字母小写,驼峰法
jar包的导出与导入
导出
1.创建工具类与方法
2.将项目导出为jar包 File–>Project Structure–>Artifacts -->JAR–>From modules with dependencies
3.导出jar包
Build -->Build Artifacts -->项目名.jar -->build
导入
在项目下,新建一个lib目录,用来存放需要拷贝的jar包
对 lib 右键 Add as Library 导入成功
建立测试类,使用自己导入的jar包工具类方法
JUnit测试的使用
黑盒测试
不考虑内部结构与特性,在 程序的接口上进行测试,检查程序是否 按照需求规格说明书规定正常使用,手动测试,不用写代码
白盒测试
由开发人员进行测试,按照程序内部的结构测试程序
JUnit就是白盒测试
1.在工程目录下创建test文件夹,不要创建在src目录下
理由:test文件夹仅仅是用来测试,不参与具体代码的运行,放在src目录下,
如果需要打包jar,那就把test也打包进去
(但是打包test是没有意义的,还会浪费空间)
2.可以使用idea快捷键生成testDemo
- Alt +Enter
- 选择JUnit4
- 生成test测试
编写测试方法的要求
- 测试方法上面要有注解 @Test
- 方法必须是public修饰
- 方法返回值必须是void
- 方法不能传入参数
基本配置文件
properties文件与XML文件
使用配置文件的好处是什么?
配置文件可以用于程序的预加载,修改程序中的一些内容,不影响整体的改动,
程序去读取文件内容,不用修改整个程序,
只需修改配置文件即可,解决了"硬编码"
硬编码:一些数据通过代码中的变量来直接实现,但是如果需要修改变量的值,
会做到一发而牵动全身,整个程序会做出改变,
这样导致了程序的可维护性降低,性能也会降低,甚至有可能出现bug
properties
Properties 是 Map 的实现类,为properties配置文件而搭配,方法只传String类型(与Map区别)
- API
public void load(InputStream inStream);
:通过输入流加载配置文件中的内容.
public String getProperty(String key);
:通过属性名获取属性值
属性文件(资源文件.配置文件),以properties文件后缀结尾
存储特点:key=value,多对数据换行分开,等号前后不能有空格
注意事项
1.配置文件放在 resources 目录下
2.配置文件是跟着字节码走的,在字节码输出路径下编译,不会被存进jar,
3.配置文件不能有空格
创建properties文件 创建resources(mark Directory as Resources) --> xx.properties
// db.properties
#用户密码 key和value前后不能有空格
username=root
password=123
解析properties文件
- 普通思路
- 把db.properties传入文件对象,再转成输入流
- 创建properties对象来读取数据
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
//创建文件对象
File file = new File("D:\\xxx\\xxxx\\webday\\resources\\db.properties");
InputStream inputStream1 = new FileInputStream(file);
//创建properties对象
Properties properties = new Properties();
//读取流中的数据,保存到properties对象中
properties.load(inputStream);
//得到db数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("username = " + username);
System.out.println("password = " + password);
}
}
缺陷
创建文件对象时,使用了绝对路径,但是往后部署项目到mac或者Linux平台时,并没有盘符,所以导致读取失败,该方法只能用于本地项目,一旦进行整体jar打包,就会出现错误
- 正确思路
- 获取db.properties文件里的内容,需要经过流来加载
- 我们可以采用类加载器来进行加载 字节码,输出该路径下的资源文件
- properties对象可以读取流中的数据
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
//获取类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//通过类加载器 输出路径下 资源文件 流
InputStream inputStream = classLoader.getResourceAsStream("db.properties");
//创建properties对象
Properties properties = new Properties();
//读取流中的数据,保存到properties对象中
properties.load(inputStream);
//得到db数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("username = " + username);
System.out.println("password = " + password);
}
}
XMl
XML :一种可扩展的标记语言,结构采用树状,一般作为配置文件存在,用于传输数据
语法
XML文件以 .xml结尾
- 文档抬头声明
<?xml version="1.0" encoding="utf-8" standalone="no"?>
1.version :版本号
2.encoding :编码格式,文档内容编码和文件本身编码必须保持一致
3.standalone :yes为不包含其他文档,no或者不写表示可包含也可不包含
- :表示XML中的元素/标签(Element),一般成对出现
- 标签中可带有属性 属性名=“属性值”(数字也要双引号)
- XML中,有且只有一个根标签(根节点)
- XML中,严格区分大小写
- XML中,标签不允许交叉嵌套
- 注释
XML大致可以分为4类来描述
1.XML文件:首先得有文件 使用 document对象来描述
2.标签/元素: element对象描述
3.标签属性: attr(attribute),Attribute对象描述
4.文本内容: text,Text描述
上述4中成员中的共性,抽象成父类org.w3c.dom.Node
,这种把XML文档加载到内存后,形成的对象,该操作我们称 DOM解析
Document对象的获取
读取xml文件
- 获取类加载器
- 通过类加载器 加载 字节码输出路径下的资源文件
- 获取DocumentBuilderFactory对象 newDefaultInstance()
- 获取DocumentBuilder对象
- 获取Document对象
一般找不到类构建对象方法时,可以找其类构造器或者工厂类对象 xxxBuilder / xxxFactory
public class XmlDemo {
public static void main(String[] args) throws Exception {
//获取类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//通过类加载器 加载 字节码输出路径下的资源文件
InputStream inputStream = classLoader.getResourceAsStream("contacts.xml");
//获取DocumentBuilderFactory对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newDefaultInstance();
//获取DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//获取Document对象
Document document = documentBuilder.parse(inputStream);
//System.out.println("document = " + document);
}
}
操作
获取联系人信息
首先需要获取跟节点/跟标签
再获取下面的linked标签linkman ,
获取第几个联系人的标签
获取该联系人的name标签
private static void getLinkedName(Document document) {
//获取跟节点
Element rootEle = document.getDocumentElement();
//获取lenked标签linkmans
NodeList linkmans = document.getElementsByTagName("linkman");
//获取第二个联系人linkman
Element linkman = (Element)linkmans.item(1); //索引从0开始 ,可以将Node强转为element子接口
//获取name标签
Element nameEle = (Element) linkman.getElementsByTagName("name").item(0);
//获取name中的文本内容 ,父接口Node,提供了getTextContent()
String textContent = nameEle.getTextContent();
System.out.println("textContent = " + textContent);
}
插入
获取根节点
添加新的标签内容,创建新的标签对象
添加属性
设置标签名
设置文本内容
把设置的东西关联到标签中
添加到Document中
最后将新增内容同步到 xml文件中
private static void addLinkedDocument(Document document) throws TransformerException {
Element rootEle = document.getDocumentElement();
//创建新标签
Element linkman = document.createElement("linkman");
//添加属性
linkman.setAttribute("id","3");
Element name = document.createElement("name");
Element email = document.createElement("email");
Element address = document.createElement("address");
Element group = document.createElement("group");
//设置文本内容 Node提供了setTextContent():返回此节点及其后代的文本内容
name.setTextContent("小月");
email.setTextContent("1314");
address.setTextContent("佛山");
group.setTextContent("幼儿园");
//关联 Node提供 appendChild():添加子节点,联系起来
linkman.appendChild(name);
linkman.appendChild(email);
linkman.appendChild(address);
linkman.appendChild(group);
rootEle.appendChild(linkman); //添加到根节点上
//同步 document的内容 到xml文件中
/*使用Transformer
* 通过TransformerFactory.newTransformer获取实例
*
* */
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//resource 输入源,内存中的Document,使用DOMSource(doc)实现类
//StreamResult:充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记
transformer.transform(new DOMSource(document),new StreamResult("D:\\JavaWolf\\Projects\\webday\\resources\\contacts.xml"));
}