1. Java开发如何编写出优秀的Java单元测试
1. 使用框架来用于单元测试
Java提供了若干用于单元测试的框架。TestNG和JUnit是最流行的测试框架。JUnit和TestNG的一些重要功能:
易于设置和运行。
支持注释
允许忽略或分组并一起执行某些测试。
支持参数化测试,即通过在运行时指定不同的值来运行单元测试。
通过与构建工具,如Ant,Maven和Gradle集成来支持自动化的测试执行。
EasyMock是一个模拟框架,是单元测试框架,如JUnit和TestNG的补充。EasyMock本身不是一个完整的框架。它只是添加了创建模拟对象以便于测试的能力。例如,我们想要测试的一个方法可以调用从数据库获取数据的DAO类。在这种情况下,EasyMock可用于创建返回硬编码数据的MockDAO。这使我们能够轻松地测试我们意向的方法,而不必担心数据库访问。
2. 谨慎使用测试驱动开发!
测试驱动开发(TDD)是一个软件开发过程,在这过程中,在开始任何编码之前,我们基于需求来编写测试。由于还没有编码,测试最初会失败。然后写入最小量的代码以通过测试。然后重构代码,直到被优化。
目标是编写覆盖所有需求的测试,而不是一开始就写代码,却可能甚至都不能满足需求。TDD是伟大的,因为它导致简单的模块化代码,且易于维护。总体开发速度加快,容易发现缺陷。此外,单元测试被创建作为TDD方法的副产品。
然而,TDD可能不适合所有的情况。在设计复杂的项目中,专注于最简单的设计以便于通过测试用例,而不提前思考可能会导致巨大的代码更改。此外,TDD方法难以用于与遗留系统,GUI应用程序或与数据库一起工作的应用程序交互的系统。另外,测试需要随着代码的改变而更新。
因此,在决定采用TDD方法之前,应考虑上述因素,并应根据项目的性质采取措施。
3. 测量代码覆盖率
代码覆盖率衡量(以百分比表示)了在运行单元测试时执行的代码量。通常,高覆盖率的代码包含未检测到的错误的几率要低,因为其更多的源代码在测试过程中被执行。测量代码覆盖率的一些最佳做法包括:
使用代码覆盖工具,如Clover,Corbetura,JaCoCo或Sonar。使用工具可以提高测试质量,因为这些工具可以指出未经测试的代码区域,让你能够开发开发额外的测试来覆盖这些领域。
每当写入新功能时,立即写新的测试覆盖。
确保有测试用例覆盖代码的所有分支,即if / else语句。
高代码覆盖不能保证测试是完美的,所以要小心!
4. 尽可能将测试数据外部化
在JUnit4之前,测试用例要运行的数据必须硬编码到测试用例中。这导致了限制,为了使用不同的数据运行测试,测试用例代码必须修改。但是,JUnit4以及TestNG支持外部化测试数据,以便可以针对不同的数据集运行测试用例,而无需更改源代码。
5. 使用断言而不是Print语句
许多新手开发人员习惯于在每行代码之后编写System.out.println语句来验证代码是否正确执行。这种做法常常扩展到单元测试,从而导致测试代码变得杂乱。除了混乱,这需要开发人员手动干预去验证控制台上打印的输出,以检查测试是否成功运行。更好的方法是使用自动指示测试结果的断言。
6. 构建具有确定性结果的测试
一些方法不具有确定性结果,即该方法的输出不是预先知道的,并且每一次都可以改变
7. 除了正面情景外,还要测试负面情景和边缘情况
通常,开发人员会花费大量的时间和精力编写测试用例,以确保应用程序按预期工作。然而,测试负面测试用例也很重要。负面测试用例指的是测试系统是否可以处理无效数据的测试用例。例如,考虑一个简单的函数,它能读取长度为8的字母数字值,由用户键入。除了字母数字值,应测试以下负面测试用例:
用户指定非字母数字值,如特殊字符。
用户指定空值。
用户指定大于或小于8个字符的值。
类似地,边界测试用例测试系统是否适用于极端值。例如,如果用户希望输入从1到100的数字值,则1和100是边界值,对这些值进行测试系统是非常重要的。
2. java junit单元测试怎么写
package com.yuanqi.zfb.test;
import org.junit.Test;
import com.yuanqi.zfb.util.VerifyCodeUtils;
public class Atest {
@Test
public void test(){
String verifycode =VerifyCodeUtils.generateVerifyCode(8);
System.out.println(verifycode);
}
@Test
public void test2(){
// String str="2015-11-23 11:23:44";
/* boolean b= str.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
if(b){
System.out.println("ok");
}else{
System.out.println("222222");
}*/
String str="2015112311:23:44";
boolean b= str.matches("\\d{10}:\\d{2}:\\d{2}");
System.out.println(b);
}
@Test
public void test3(){
String trTime="2014112800:05:48";
String inyear=trTime.substring(0, 4);
String inmonth=trTime.substring(4,6);
String inday=trTime.substring(6,8);
String intime=trTime.substring(8);
String time=inyear+"-"+inmonth+"-"+inday+" "+intime;
System.out.println(time);
}
}
3. java怎么做单元测试,紧急
java很多概念都和C++一样,所以看core java的时候也没有字斟句酌,很多地方都是跳着看的。
大概了解了一些细节,比staticmethod,final域等。印象比较深的是static变量,一个class有一个static变量,而其衍生的object都是通用这个变量的。
在下面的例子中nextId就是如此了,呵呵,这样来定义id,估计也只是教科书用的,工业上都是采用数据库来处理了。后面提一下,java的单元测试挺有意思的,每一个类都可以整个main函数,就是一个文件里面可以存在多个main函数,要测啥就直接java一下那个类名就可以了,例子如下:public class StaticTest{public static void main(String[] args){Employee[] staff = new Employee[3];staff[0] = new Employee("Tom", 40000);staff[1] = new Employee("Dick", 60000);staff[2] = new Employee("Harry", 65000);for (Employee e : staff){e.setId();System.out.println("name=" + e.getName() + ", id=" + e.getId() +", salary=" + e.getSalary());}int n = Employee.getNextId();System.out.println("Next available id=" + n);}}class Employee{public Employee(String n, double s){name = n;salary = s;id = 0;}public String getName(){return name;}public double getSalary(){return salary;}public int getId(){return id;}public void setId(){id = nextId;nextId++;}public static int getNextId(){return nextId;}public static void main(String[] args){Employee e = new Employee("Harry", 50000);System.out.println(e.getName() + " " + e.getSalary());}private String name;private double salary;。
4. JAVA单元测试
首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成。
使用简单的 @Test 注解实现我们的测试方法的编写和执行 准备工作做好之后,接下来我们就可以开始尝试编写壹个简单的测试代码了。首先,我们编写了壹个 Calculator 类,62616964757a686964616fe78988e69d8331333361323533并提供五个方法分别完成加减乘除以及求平方的运算。
代码如下: package net.oschina.bairrfhoinn.main; public class Calculator { public void add(int n){ result += n; } public void substract(int n){ result -= n; } public void multiply(int n){ result *= n; } public void divide(int n){ result /= n; } public void square(int n){ result = n * n; } public int getReuslt(){ return result; } public void clear(){ result = 0; } private static int result; } 在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*。
把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在测试的时候使用的壹系列assertEquals()方法就来自这个包。
大家注意壹下,这是壹个静态包含(static),是JDK5中新增添的壹个功能。也就是说,assertEquals是Assert类中的壹系列的静态方法,壹般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。
另外要注意的是,我们的测试类是壹个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。
所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明,我们接着会讲到。在测试类中,并不是每壹个方法都是用于测试的,所以我们必须使用“注解”来明确表明哪些是测试方法。
“注解”也是JDK5的壹个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有@Before、@Test、@Ignore等字样,这些就是注解,以壹个“@”作为开头。
这些注解都是JUnit4自定义的,熟练掌握这些注解的含义,对于编写恰当的测试类非常重要。 接下来我们创建壹个测试类 CalculatorTest.java,代码如下: package net.oschina.bairrfhoinn.test; import static org.junit.Assert.*; import org.junit.Test; import net.oschina.bairrfhoinn.main.Calculator; public class CalculatorTest { private static Calculator calculator = new Calculator(); @Test public void testAdd(){ calculator.add(7); calculator.add(8); assertEquals(15, calculator.getReuslt()); } } 首先,我们要在方法的前面使用@Test标注,以表明这是壹个测试方法。
对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出壹个异常。
至于方法内该写些什么,那就要看你需要测试些什么了。比如上述代码中,我们想测试壹下add()方法的功能是否正确,就在测试方法中调用几次add函数,初始值为0,先加7,再加8,我们期待的结果应该是15。
如果最终实际结果也是15,则说明add()方法是正确的,反之说明它是错的。assertEquals(15, calculator.getResult());就是用来判断期待结果和实际结果是否相等,其中第壹个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。
这样写好之后,JUnit 会自动进行测试并把测试结果反馈给用户。 如果想运行它,可以在 eclipse 的资源管理器中选择该类文件,然后点击右键,选择 Run As->JUnit Test 即可看到运行结果。
使用@Test 的属性 Ignore 指定测试时跳过这个方法 如果在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现并且确定下来。因此,即使该方法尚未完成,他的具体功能也是确定的,这也就意味着你可以为他编写测试用例。
但是,如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候无疑是“失败”。这种失败和真正的失败是有区别的,因此 JUnit 提供了壹种方法来区别他们,那就是在这种测试函数的前面加上 @Ignore 标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。
这样的话测试结果就会提示你有几个测试被忽略,而不是失败。壹旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
比如说上面的测试类 Calculator.java 中,假设我们的 Calculator 类的 multiply() 方法没有实现,我们可以在测试类 CalculatorTest 中先写如下测试代码: package net.oschina.bairrfhoinn.test; import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Test; import net.oschina.bairrfhoinn.main.Calculator; public class CalculatorTest { private static Calculator calculator = new Calculator(); 。 //此处代码省略 @Ignore("method square() not implemented, please test this later。
") @Test public void testSquare(){ calculator.square(3); assertEquals(9, calculator.getReuslt()); } } 我们再运行壹次测试,会看到如下结果,从图中可以很明显的看出,方法testSquare() 上的 @Ignore 注解已经生效了,运。
5. java怎么做单元测试,紧急
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。比如可以测试一个类,或者一个类中的一个方法。
以下是测试用例类的基本结构:
public class HelloWorldTest extends TestCase
{
/*
* 每次用例执行前要执行的初始化方法
*/
protected void setUp( ) throws Exception
{
super.setUp();
}
/*
* 每次用例执行后要执行的清除功能
*/
protected void tearDown( ) throws Exception
{
super.tearDown();
}
/*
* 一个测试方法,在其中实现对被测单元的调用,并验证
*/
public final void testCalculate( )
{
//TODO 实现 calculate()。
}
}
6. java定时任务怎么写单元测试
如果要执行一些简单的定时器任务,无须做复杂的控制,也无须保存状态,那么可以考虑使用JDK 入门级的定期器Timer来执行重复任务。
一、原理 JDK中,定时器任务的执行需要两个基本的类: java.util.Timer; java.util.TimerTask; 要运行一个定时任务,最基本的步骤如下:1、建立一个要执行的任务TimerTask。2、创建一个Timer实例,通过Timer提供的schedule()方法,将 TimerTask加入到定时器Timer中,同时设置执行的规则即可。
当程序执行了Timer初始化代码后,Timer定时任务就会按照设置去执行。 Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。
该方法的格式如下: void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。 void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。 void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
如果要执行一些简单的定时器任务,无须做复杂的控制,也无须保存状态,那么可以考虑使用JDK 入门级的定期器Timer来执行重复任务。
一、原理JDK中,定时器任务的执行需要两个基本的类: java.util.Timer; java.util.TimerTask;要运行一个定时任务,最基本的步骤如下:1、建立一个要执行的任务TimerTask。2、创建一个Timer实例,通过Timer提供的schedule()方法,将 TimerTask加入到定时器Timer中,同时设置执行的规则即可。
当程序执行了Timer初始化代码后,Timer定时任务就会按照设置去执行。Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。
该方法的格式如下: void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。 void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。 void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。
可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。
此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。
它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。
另外它还有两个非抽象的方法: boolean cancel() 取消此计时器任务。 long scheduledExecutionTime() 返回此任务最近实际 执行的安排 执行时间。
二、例子下面用Timer实现一个简单例子:package stu.timer;import java.util.Date;import java.util.TimerTask;/*** 重复执行的任务** @author leizhimin,2008-10-9 9:20:20*/public class TestTimerTask extends TimerTask { /** * 此计时器任务要执行的操作。 */ public void run() { Date executeTime = new Date(this.scheduledExecutionTime()); System.out.println("本次任务执行的时间是" + executeTime); }}package stu.timer;import java.util.Timer;import java.util.TimerTask;/*** 测试JDK Timer的执行** @author leizhimin,2008-10-9 9:24:35*/public class TestTimer { public static void main(String[] args) { Timer timer = new Timer(); TimerTask task = new TestTimerTask(); timer.schedule(task, 500L, 1000L); }}运行结果:本次任务执行的时间是Thu Oct 09 09:47:57 CST 2008本次任务执行的时间是Thu Oct 09 09:47:58 CST 2008本次任务执行的时间是Thu Oct 09 09:47:59 CST 2008本次任务执行的时间是Thu Oct 09 09:48:00 CST 2008本次任务执行的时间是Thu Oct 09 09:48:01 CST 2008本次任务执行的时间是Thu Oct 09 09:48:02 CST 2008本次任务执行的时间是Thu Oct 09 09:48:03 CST 2008本次任务执行的时间是Thu Oct 09 09:48:04 CST 2008本次任务执行的时间是Thu Oct 09 09:48:05 CST 2008 。
7. java怎么做单元测试,紧急
java很多概念都和C++一样,所以看core java的时候也没有字斟句酌,很多地方都是跳着看的。大概了解了一些细节,比staticmethod,final域等。印象比较深的是static变量,一个class有一个static变量,而其衍生的object都是通用这个变量的。在下面的例子中nextId就是如此了,呵呵,这样来定义id,估计也只是教科书用的,工业上都是采用数据库来处理了。
后面提一下,java的单元测试挺有意思的,每一个类都可以整个main函数,就是一个文件里面可以存在多个main函数,要测啥就直接java一下那个类名就可以了,例子如下:
public class StaticTest{public static void main(String[] args){Employee[] staff = new Employee[3];
staff[0] = new Employee("Tom", 40000);
staff[1] = new Employee("Dick", 60000);
staff[2] = new Employee("Harry", 65000);
for (Employee e : staff){
e.setId();System.out.println("name=" + e.getName() + ", id=" + e.getId() +
", salary=" + e.getSalary());}int n = Employee.getNextId();
System.out.println("Next available id=" + n);}}class Employee{public Employee(String n, double s){name = n;salary = s;id = 0;}public String getName(){return name;}public double getSalary(){return salary;}public int getId(){return id;}public void setId(){id = nextId;nextId++;}public static int getNextId(){return nextId;}public static void main(String[] args){Employee e = new Employee("Harry", 50000);
System.out.println(e.getName() + " " + e.getSalary());}private String name;
private double salary;
转载请注明出处育才学习网 » java单元测试怎么写