在生前一定要做完想做的事!

接上篇单元测试

上一篇 / 下一篇  2008-10-20 13:58:12 / 个人分类:junite


l
测试对象及辅助对象在@Before方法中初始化。
l全局资源可以在@BeforeClass方法中初始化。
l全局资源通常启动缓慢,数据库,Web服务器,放入@BeforeClass使之仅初始化一次加快测试速度。
l要测试一个方法应当编写多个测试方法,每个测试方法各有侧重。
l测试方法要覆盖所有可能抛出异常的情况
当遇到错误,最好的分析步骤是
l检查环境。
数据库链接,数据库中的数据是否正常?配置是否正常?网络是否正常?
l检查测试代码。
参数是否传错误?断言的预期值是否错误?
l检查程序。
debug
接口:
public interface ICalculatorService{
/**
 *计算器中加法功能的计算
 * @return参数a,b的和
 */
public double add(double a,double b);
}
实现:
public class CalculatorService implements ICalculatorService{
public double add(double a, double b){
return a+b;
}
}
基类:
Public class BaseCase{
ICalculatorService calculotorService;
Public BaseCase(){
calculatorService = new CalculatorService();
}
}
public class AddTest extends BaseCase{
@BeforeClass
 public static void beforeClass() {}
@AfterClass
 public static void afterClass(){}
@Before
public void before() {}
@After
 public void after(){}
/**
 *测试输入为0的情况
 *预期值为0
 */
@Test
 public void testZero(){
double result = calculatorService.add(0,0);Assert.assertEquals(0,result);
}
}
例如组合测试计算器中的加减乘除的测试方法
import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 @RunWith(Suite.class)
 @SuiteClasses(value = { AddTest.class })
 @SuiteClasses(value = { MinusTest.class })
 @SuiteClasses(value = { MultiplyTest.class })
 @SuiteClasses(value = { divideTest.class })
 public class AllTests {
 }
lpublic class BaseCase {
//获取日志对象,并提供给它该类的日志信息
protected final Logger log = LoggerFactory.getLogger(this.getClass());
//初始化要测试的接口
 protected static RefundCommonAOrefundCommonAO;
//初始化要测试的接口
protected static RefundFlowAOrefundFlowAO;
//声明数据库链接文件
protected static StringDB_PROPERITY = "db.properties";
//声明JdbcTemplate以便对数据库进行操作
protected static JdbcTemplatejdbcTemplate;
l//获取spring类路径相关上下文的引用
lstatic{
lApplicationContext context =new ClassPathXmlApplicationContext(new String[]{
l"biz-manager.xml",
l"spring-persistence.xml",
l"spring-refund-dao.xml",
l"spring-refund-payway.xml",
l"spring-refund-process.xml",
l"spring-refund-service.xml",
l"tc-client.xml",
l"config_currect.xml",
l"spring-refund-ao.xml"
l});
l//从上下文中获取被测试接口的引用。
lrefundCommonAO =(RefundCommonAO)context.getBean("refundCommonAO");
l
l//从上下文中获取被测试接口的引用。
lrefundFlowAO = (RefundFlowAO)context.getBean("refundFlowAO");
l
l//从上下文中获取jdbcTemplete的引用,以便对数据库进行操作
ljdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");}
l}
l//如果测试的接口需要有数据源,那么需要调用此方法,把在excel里准备的测试数据添加到DB_PROPERITY中所定义的数据库中。
public static void createTestData(String fileName) throws Exception{
URL excelUrl = BaseCase.class.getClassLoader().getResource(fileName);
URL dbUrl = BaseCase.class.getClassLoader().getResource(DB_PROPERITY);
DataGenerator.tearDown(new String[]{excelUrl.getFile()}, dbUrl.getFile());
DataGenerator.setUp(new String[]{excelUrl.getFile()}, dbUrl.getFile());
l}
l//调用此方法,删除调用createTestData添加的数据。以清理测试产生的垃圾数据。
public static void deleteTestData(String fileName) throws Exception{
URL excelUrl = BaseCase.class.getClassLoader().getResource(fileName);
URL dbUrl = BaseCase.class.getClassLoader().getResource(DB_PROPERITY);
DataGenerator.tearDown(new String[]{excelUrl.getFile()}, dbUrl.getFile());
}
l
l//在测试类中可以调用此方法对数据库进行操作
public void operaterData(String sql){
jdbcTemplate.execute(sql);
}
public class QueryInfoByActionTest extends BaseCase{
RefundInfoQuery query;
 //退款id6000002
private final static longPARAM = InstanceClass.REFUND_ID_6000002;
/**
 *调用BaseCasecreateTestData在数据库中添加excel中已准备好的测试数据。
      * instanceClass.INIT_DATA_SOURCE = excel文件名
 */
@BeforeClass
public static void createTestData() throws Exception{
createTestData(InstanceClass.INIT_DATA_SOURCE);
}
//在所有的测试方法都执行之后,清理createTestData保存进数据库中的数据
@AfterClass
public static void deleteTestData() throws Exception{
deleteTestData(InstanceClass.INIT_DATA_SOURCE);
}
//在每个测试方法运行之前,执行此方法。这里是用来准备测试参数的。
@Before
public void before(){
query =new RefundInfoQuery();
query.setAction(RefundConstants.VIEW_REFUND_DETAIL); //查看退款详情
query.setBizOrderId(PARAM);
query.setRefundId(PARAM);
query.setUserNumId(1234);
l
}
/**
 *查看输入参数在数据库中不存在时的返回值
 *预期success = false; resultCode = NO_REFUND_RECORD
* 说明:InstanceClass.DELETE_REFUND_BY_ID ="delete from tc_refund_trade t where t.REFUND_ID = ";
* 说明:longInstanceClass.REFUND_ID_60159864 = 60159864(REFUND_ID的值)
 */
@Test
public void testRefundIsNotExit(){
 long param=InstanceClass.REFUND_ID_60159864;
 super.operaterData(InstanceClass.DELETE_REFUND_BY_ID +param);//删除退款表中refundID60159864的数据
query.setRefundId(param); //把已删除掉的refundId传到参数中进行查询
ResultSupport result =refundCommonAO.queryInfoByAction(query);//调用被测方法把参数传进去
//以下为断言:检查返回值与预期值是否相等
Assert.assertFalse(result.isSuccess());
Assert.assertEquals(RefundResultCode.NO_REFUND_RECORD, result.getResultCode());
}
}



TAG: junit 单元测试 接口测试 junite

 

评分:0

我来说两句

日历

« 2024-03-24  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 10182
  • 日志数: 10
  • 建立时间: 2008-02-18
  • 更新时间: 2009-10-26

RSS订阅

Open Toolbar