2、测试套件与自动化测试

1、目录删除的测试

目录删除类

import java.io.File;

public class DeleteAll
{
	public static void deleteAll(File file)
	{
		if(file.isFile() || file.list().length == 0)
		{
			file.delete();
		}
		else
		{
			File[] files = file.listFiles();
			for(File f : files)
			{
				deleteAll(f);
				f.delete();
			}
		}
	}
}


其测试类:

import java.io.File;

import junit.framework.Assert;
import junit.framework.TestCase;

public class DeleteAllTest extends TestCase
{
	public void testDeleteAll()
	{
		File file = null;
		try
		{
			file = new File("test.txt");
			file.createNewFile();
			DeleteAll.deleteAll(file);
		}
		catch(Exception e)
		{
			
		}
		boolean isExist = file.exists();
		Assert.assertEquals(false, isExist);
		//Assert.assertFalse(isExist);
	}
	/**
	 * 构造的是一个目录结构,其结构表示如下
	 *     d
	 *     /\
	 *    /  \
	 *   d1   d2
	 *  /  \
	 * s1   s2
	 * 
	 */
	public void testDeleteAll2()
	{
		File directory = null;
		try
		{
			directory = new File("dir");
			directory.mkdir();
			File file1 = new File(directory,"file1.txt");
			File file2 = new File(directory,"file2.txt");
			file1.createNewFile();
			file2.createNewFile();
			File d1 = new File(directory,"d1");
			File d2 = new File(directory,"d2");
			d1.mkdir();
			d2.mkdir();
			File subFile1 = new File(d1,"subtest1.txt");
			File subFile2 = new File(d2,"subtest2.txt");
			subFile1.createNewFile();
			subFile2.createNewFile();
			
			DeleteAll.deleteAll(directory);
		}
		catch(Exception e)
		{
			Assert.fail();
		}
		Assert.assertNotNull(directory);
		String[] names = directory.list();
		Assert.assertEquals(0, names.length);
		directory.delete();
	}
}


2、对私有方法的测试

public class Calculator2
{
	private int add(int a,int b)
	{
		return a + b;
	}
}


import java.lang.reflect.Method;

import junit.framework.Assert;
import junit.framework.TestCase;

public class Calculator2Test extends TestCase
{
	public void testAdd()
	{
		try
		{
			Calculator2 cal2 = new Calculator2();
			Class clazz = Calculator2.class;
			Method method = clazz.getDeclaredMethod("add",new Class[] {Integer.TYPE,Integer.TYPE});
			method.setAccessible(true);
			Object result = method.invoke(cal2, new Object[]{2,3});
			Assert.assertEquals(5, result);
		}
		catch(Exception e)
		{
			Assert.fail();
		}
	}
}

对私有方法的测试使用反射机制来进行。

测试类的私有方法时可以采取两种方式:一是修改方法的修饰符,将private修改为default或public(但是不推荐采取这种方法),二是使用反射在测试类中调用目标类的私有方法(推荐使用这种方法)。

 3、使用MyEclipse的Junit Test Case自动生成测试类

在New Java Class图标下有一个Junit Test Case项,使用它可以在提示下一步一步自动生成测试类。

4、TestSuite(测试套件):可以将多个测试组合在一起,同时执行多个测试,实现测试的自动化。

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase
{
	public static Test suite()
	{
		TestSuite suite = new TestSuite();
		
		suite.addTestSuite(CalculatorTest.class);
		suite.addTestSuite(LargestTest.class);
		suite.addTestSuite(DeleteAllTest.class);
		
		return suite;
	}
}

使用RepeatedTest来重复测试指定的类的方法,具体是对测试类添加一个带一个String类型的参数的构造函数,然后在使用RepeatedTest时指定测试的方法。

import junit.extensions.RepeatedTest;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase
{
	public static Test suite()
	{
		TestSuite suite = new TestSuite();
		
		suite.addTestSuite(CalculatorTest.class);
		suite.addTestSuite(LargestTest.class);
		suite.addTestSuite(DeleteAllTest.class);
		
		suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"),20));
		return suite;
	}
}



 

你可能感兴趣的:(单元测试)