发表于: 2018-03-18 22:35:51
1 447
今天完成的事情:
1,学习JUnit
单元测试用例是代码的一部分从而确保代码(方法)的另一部分工作正常。要快速实现这些理想的效果,测试框架是必需的
正式书面单元测试用例的特征是输入和期望的输出,这是在执行测试之前制定的。已知的输入应该作为测试的前提条件以及预期输出应该为测试后置条件。
必须有至少两个单元测试用例针对每个要求: 一个正测试和负测试。如果要求有不合要求,每个子需求必须至少有两个测试用例作为正负。
JUnit提供:
- 断言测试预期结果。
- 测试功能共享通用的测试数据。
- 测试套件轻松地组织和运行测试。
- 图形和文本测试运行。
JUnit用于测试:
- 整个对象
- 对象的一部分 - 交互的方法或一些方法
- 几个对象之间的互动(交互)
简单的单元测试用例
@Test
public void addUser() throws Exception {
User user=new User();
user.setName("盛世美颜");
user.setAge(23);
user.setRecommend("嗦嘎");
userDao.addUser(user);
System.out.println("@Test所添加的名字='"+user.getName()+"'");
assertEquals("盛世美颜",user.getName());
}
当assertEquals中的预期值,与user.getName();获取的值相等时,得到如下:
当断言判断期望值与实际值不符时,会提示如下信息:
junit中的其他注解:
@Test public void method() | 测试注释指示该公共无效方法它所附着可以作为一个测试用例。 |
@Before public void method() | Before注释表示,该方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。 |
@BeforeClass public static void method() | BeforeClass注释指出这是附着在静态方法必须执行一次并在类的所有测试之前。发生这种情况时一般是测试计算共享配置方法(如连接到数据库)。 |
@After public void method() | After 注释指示,该方法在执行每项测试后执行(如执行每一个测试后重置某些变量,删除临时变量等) |
@AfterClass public static void method() | 当需要执行所有的测试在JUnit测试用例类后执行,AfterClass注解可以使用以清理建立方法,(从数据库如断开连接)。注意:附有此批注(类似于BeforeClass)的方法必须定义为静态。 |
@Ignore public static void method() | 当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为@Ignore的方法将不被执行。 |
JUit断言
断言 | 描述 |
void assertEquals([String message], expected value, actual value) | 断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息 |
void assertTrue([String message], boolean condition) | 断言一个条件为真 |
void assertFalse([String message],boolean condition) | 断言一个条件为假 |
void assertNotNull([String message], java.lang.Object object) | 断言一个对象不为空(null) |
void assertNull([String message], java.lang.Object object) | 断言一个对象为空(null) |
void assertSame([String message], java.lang.Object expected, java.lang.Object actual) | 断言,两个对象引用相同的对象 |
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual) | 断言,两个对象不是引用同一个对象 |
void assertArrayEquals([String message], expectedArray, resultArray) | 断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object. |
@RunWith(SpringJUnit4ClassRunner.class)
在使用所有注释前必须使用@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
@ContextConfiguration(locations = {"classpath:applicationContext.xml"} , loader = GenericXmlContextLoader.class)
@ContextConfiguration 用来指定加载的Spring配置文件的位置,会加载默认配置文件,
@ContextConfiguration 注解有以下两个常用的属性:
1,locations:可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或多个 Spring 配置文件用‘,’分开。如下所示:
@ContextConfiguration(locations={“aa/aa.xml”," aa/bb.xml”})
2,inheritLocations:是否要继承父测试用例类中的 Spring 配置文件,默认为 true。
2,Log4j
日志记录的优缺点
日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试,维护方便,以及应用程序的运行时信息结构化存储。
日志记录确实也有它的缺点。它可以减缓的应用程序。如果太详细,它可能会导致滚动失明。为了减轻这些影响,log4j被设计为是可靠,快速和可扩展。
由于记录很少为应用的主要重点,但log4j API致力于成为易于理解和使用。
Log4j配置
log4j.properties文件是一个键 - 值对保存 log4j 配置属性文件。
默认情况下,日志管理在CLASSPATH 查找一个名为 log4j.properties 的文件。
- 根日志记录器的级别定义为DEBUG并连接附加器命名为X到它
- 设置名为X的附加目的地是一个有效的appender
- 设置布局的附加器X
log4j.properties语法:
以下是 log4j.properties 文件的一个appender X的语法:
# Define the root logger with appender X
log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n
需要注意的是log4j支持UNIX风格的变量替换,如 ${variableName}.
Appender对象主要负责打印日志消息到不同的目的地,如控制台,文件,sockets,NT事件日志等等。
每个Appender对象具有与之相关联的不同的属性,并且这些属性表明对象的行为
属性 | 描述 |
layout | Appender使用布局Layout 对象和与之相关的格式化的日志记录信息转换模式 |
target | 目标可以是一个控制台,一个文件,或根据附加器的另一个项目 |
level | 级别是必需的,以控制日志消息的过滤 |
threshold | Appender可以有与之独立的记录器级别相关联的级别阈值水平。Appender忽略具有级别低于阈级别的任何日志消息 |
filter | Filter 对象可以分析超出级别的匹配记录信息,并决定是否记录的请求应该由一个特定 Appender 或忽略处理 |
2.配置日志信息输出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4.控制台选项
Threshold=DEBUG: | 指定日志消息的输出最低层次。 |
ImmediateFlush=true: | 默认值是true,意谓着所有的消息都会被立即输出。 |
Target=System.err: | 默认情况下是:System.out,指定输出控制台 |
FileAppender 选项
Threshold=DEBUF: | 指定日志消息的输出最低层次。 |
ImmediateFlush=true: | 默认值是true,意谓着所有的消息都会被立即输出。 |
File=mylog.txt: | 指定消息输出到mylog.txt文件。 |
Append=false: | 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 |
RollingFileAppender 选项
Threshold=DEBUG: | 指定日志消息的输出最低层次。 |
ImmediateFlush=true: | 默认值是true,意谓着所有的消息都会被立即输出。 |
File=mylog.txt: | 指定消息输出到mylog.txt文件。 |
Append=false: | 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 |
MaxFileSize=100KB: | 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。 |
MaxBackupIndex=2: | 指定可以产生的滚动文件的最大数。 |
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n |
|
5.日志信息格式中几个符号所代表的含义:
-X号: | X信息输出时左对齐; |
%p: | 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, |
%d: | 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 |
%r: | 输出自应用启动到输出该log信息耗费的毫秒数 |
%c: | 输出日志信息所属的类目,通常就是所在类的全名 |
%t: | 输出产生该日志事件的线程名 |
%l: | 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) |
%x: | 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 |
%%: | 输出一个"%"字符 |
%F: | 输出日志消息产生时所在的文件名称 |
%L: | 输出代码中的行号 |
%m: | 输出代码中指定的消息,产生的日志具体信息 |
%n: | 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 |
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如下:
%20c: | 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 |
%-20c: | 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 |
%.30c: | 指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 |
%20.30c: | 如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。 |
用法:
public class log4jExample{
static Logger log = Logger.getLogger(log4jExample.class.getName());
public static void main(String[] args)throws IOException,SQLException{
log.debug("Debug");
log.info("Info");
}
}
3,SLF4J
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用
那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志
4,在服务器上部署开发环境
JDK:
maven:
Mysql:
5,用Maven命令跑单元测试。
写了个简单的hello world,直接将整个项目文件拖到服务器上,然后再项目文件下运行 mvn test,结果如下
明天计划的事情:
在服务器上跑通流程,接着往后面做
遇到的问题:
就是打包的时候,始终不能运行,提示没有主程序清单,百度暂时还没解决
收获:
学习了日志,单元测试,服务器上部署环境
进度:任务一步骤23
任务开始时间:3.10
预计demo时间:3.23
是否延期:否
禅道地址:http://task.ptteng.com/zentao/project-task-562.html
评论