发表于: 2018-10-14 01:07:24
1 466
任务一 DAY 17
今天计划:
1.JUnit
2.Log4j
3.IDE的Debug模式
今天完成:
1 JUnit
单元测试用例是一部分代码,可以确保另一端代码(方法)按预期工作。为了迅速达到预期的结果,就需要测试框架。
1.1 Annotation注解/元数据(描述数据的数据)
在New —— JUnit Test Case 的窗口,给这4选项打钩:
https://www.jianshu.com/p/6e0ad462479b
https://blog.csdn.net/cdw8131197/article/details/52293725
(1) @Test : 测试方法,测试程序会运行的方法,后边可以跟参数代表不同的测试。
@Test(expected=XXException.class):异常类测试,当你预知代码会出现某个异常,使用expected,当代码出现该异常时不会抛出,保证代码的执行
@Test(expected=ArithmeticException.class):检查被测方法是否抛出ArithmeticException异常
如:// 0不能作为除数,10÷0 错误
测试时抛出异常:java.lang.ArithmeticException: / by zero
在@Test加入(expected=ArithmeticException.class) 之后再进行测试,则不会抛出异常。
@Test(timeout = xxx) :该元数据传入了一个时间(毫秒)给测试方法,限制测试,超时则失败,对于逻辑很复杂,循环嵌套深,可能出现死循环的程序,可采取此预防措施。
上面报错:运行时间超了:TestTimedOutException: test timed out after 100 milliseconds
// 让当前线程沉睡100毫秒
// 精准控时
(2) @Ignore(“该方法还没有实现”) :String参数,表明为什么会忽略这个测试方法。
该注解加在@Test上一行,在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接)。
(3) @Before:每个测试方法前都要执行一次,可以用于把对象复原,以免对其他测试造成影响。这个相当于取代了JUnit以前版本中的setUp方法
(4) @After:每一个测试方法之后运行,相当于取代了JUnit以前版本中的tearDown方法
(5) @BeforeClass:在类被装载的时候就被调用(还未创建实例),所以需要static方法,还需要public,且每个类仅能有一个
(6) @AfterClass::所有测试结束之后运行
1.2 Assert类常用方法
这个类提供了很多有用的断言方法来编写测试用例。只有失败的断言才会被记录。
* 以前用的Assert.assertEquals()过期了,直接用assertEquals();
assertEquals(Object expected, Object actual):assertEquals(期望值,真实值)判断右边的真实值与左边期望值是否一致。
如(true, true)或(false, false),两个值相同,则不会抛出异常;
如(true, false)等,两个值不同,则抛出异常:java.lang.AssertionError: expected:<......> but was:<......>
1.3 参数化测试
使用不同的值反复运行同一个测试。参数化测试需指定RunWith为:Parameterized. class
代码参考了:https://blog.csdn.net/luanlouis/article/details/37563265
步骤:
(1)对测试类添加注解 @RunWith(Parameterized.class)
// calculator类已经声明了 isEven(int i) 方法判断输入数字是否是偶数
(2)将需要使用变化范围参数值测试的参数定义为私有变量
(3)使用上一步骤声明的私有变量作为入参,创建(该测试类的)构造函数
*取代第2-3步,另一种变量注入形式,变量的值不通过构造函数初始化,而是通过JUnit注入:
使用@Parameter标注public变量,JUnit会遍历每组参数进行注入 ;
注解中的整数参数表示注入参数组中的第几个参数;
(4)创建一个使用 @Parameters 注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回
(5)使用定义的私有变量定义测试方法
测试结果:
第1组数据,1不是偶数,则(true, false),抛出异常:expected:<true> but was:<false>
1.4 打包测试
在一个项目中,只写一个测试类是不可能的,会写出多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦,
鉴于此,JUnit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性运行完毕,方便了我们的测试工作。
选中JAVA测试类文件,右键 —— NEW —— Other —— 筛选器输入test —— 选 JUnit Test Suite
会列出这个包下所有的测试方法:
生成:
根据需要来增减 @SuiteClasses({}) 里的测试类即可。
2 Log4j
https://blog.csdn.net/Evankaka/article/details/45815047
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。
日志信息的优先级:从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;
日志信息的输出目的地:指定了日志将打印到控制台还是文件中;
输出格式:控制了日志信息的显示内容。
loggers:负责采集日志信息。
appenders:负责将日志信息发布到不同地方。
layouts:负责以各种风格格式化日志信息。
准备:
先把JAR包导入JAVA项目:
Log4j.properties 配置文件放到src下:
2.1 配置文件:log4j.properties
(1)配置根Logger
log4j.rootLogger = [ level ] , appenderName, appenderName, …
Log4j建议只使用四个日志记录的优先级,从高到低:ERROR、WARN、INFO、DEBUG
一般用于控制台的appender都命名为stdout(?):
(2)配置日志信息输出目的地Appender
log4j.apperder.*** = org.apache.log4j.*****Appender
Log4j提供的几种appender:
指定输出等级:https://blog.csdn.net/ryelqy/article/details/74999739
log4j.appender.R.Threshold = DEBUG
指定某个appender的Threshold为DEBUG,那这个appender输出的日志信息就是DEBUG级别以及DEBUG以上的级别;
Log4j根据日志信息的重要程度:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
(3)配置日志信息的格式(布局,layout)
log4j.appender. ***.layout.option = org.apache.log4j.*****Layout
Log4j提供的几种layout:
(4)Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m:输出代码中指定的消息
%p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r:输出自应用启动到输出该log信息耗费的毫秒数
%c:输出所属的类目,通常就是所在类的全名
%t:输出产生该日志事件的线程名
%n:输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l:输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
具体:
2.2 配置文件:log4j.xml
也可以用XML形式配置Log4j。Log4j的LogManager默认先查找log4j.xml,若没有则查找log4j.properties
https://blog.csdn.net/yangfengjueqi/article/details/77095235
<log4j:configuration xmlns="......">
(
renderer*,
appender*,
plugin*,
(category | logger)*,
root?,
(categoryFactory | loggerFactory)?
)
<log4j:configuration/>
到控制台:
FileAppender:
RollingFileAppender:
DailyRollingFileAppender:
测试使用:
生成:
控制台:最小INFO,最大ERROR
日志文件:
2.2 在代码中使用Log4j
一般使用的步骤:
(1)得到记录器
获取日志记录器,这个记录器将负责控制日志信息:
public static Logger getLogger( String name)
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
(2)读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
(3)插入记录信息(格式化日志信息)
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
控制台stdout:
生成日志文件:
3 Eclipse的Debug模式
http://blog.jobbole.com/93421/
https://blog.csdn.net/u011781521/article/details/55000066
在所有调试中,调试一个Java程序是最简单的,主要有设置断点、启动调试、单步执行、结束调试几步。
设置断点:在源代码文件中,在想要设置断点的代码行的前面的标记行处,双击鼠标左键就可以设置断点,在相同位置再次双击即可取消断点。
*条件断点:可以给该断点设置触发条件,一旦满足某条件的时候才开始调试。
https://blog.csdn.net/rchm8519/article/details/65452001
在循环内部的语句插入断点:
设置断点属性Breakpoint Properties:变量i的值为50的时候才开始调试
循环停在i==50:
启动调试:Eclipse提供四种方式来启动程序(Launch)的调试,分别是通过菜单(Run –> Debug)、图标(“绿色Bug”)、右键->Debug As以及快捷键(F11),在这一点上,与其他命令(例如Run)类似。
单步执行:主要使用前面讲过的几个视图进行调试,其中debug视图中的几个按钮有快捷键:
Step Retuen(F7)、Step Over (F6)、Step Into (F5)
结束调试:通过Terminate命令终止对本地程序的调试。
简单测试:
什么都有:
表达式:
明天计划:
1.MyBatis
2.买服务器,部署数据库、代码、Maven等等到服务器上
3.用Maven命令跑单元测试
4.执行Main方法,在服务器上跑通流程
遇到问题:
1. Eclipse编辑log4j.xml文件,用XML编辑器编辑,没有自动补全功能
解决:
https://stackoverflow.com/questions/5000884/eclipse-referencing-log4j-dtd-in-log4j-xml#
XML文件头部的 !DOCTYPE 格式问题,换这个就可以了:
<!DOCTYPE log4j:configuration PUBLIC
"-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
收获:
1.学习使用JUnit
assertEquals的用法;参数化测试;打包测试
2.学习使用Log4j
Log4j根据日志信息的重要程度:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
log4j.properties文件和log4j.xml文件的写法;
对比:Log4j优先查找log4j.xml,没有xml才去查找log4j.properties
3.了解IDE的Debug模式
评论