51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3666|回复: 0
打印 上一主题 下一主题

[原创] Java单元测试之容器内部测试

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:07
  • 签到天数: 1020 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-11-26 10:49:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     1、HttpUnit
      HttpUnit是一个集成测试工具,主要关注Web应用的测试,提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让你可以不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。
      HttpUnit简介
      HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。当前的最新版本是1.5.4。为了让HtpUnit正常运行,你应该安装JDK1.3.1或者以上版本。
      工作原理
      HttpUnit通过模拟浏览器的行为,处理页面框架(frames),cookies,页面跳转(redirects)等。通过HttpUnit提供的功能,你可以和服务器端进行信息交互,将返回的网页内容作为普通文本、XML Dom对象或者是作为链接、页面框架、图像、表单、表格等的集合进行处理,然后使用JUnit框架进行测试,还可以导向一个新的页面,然后进行新页面的处理,这个功能使你可以处理一组在一个操作链中的页面。
      和其他商业工具的对比
      商业工具一般使用记录、回放的功能来实现测试,但是这里有个缺陷,就是当页面设计被修改以后,这些被记录的行为就不能重用了,需要重新录制才能继续测试。
      举个例子:如果页面上有个元素最先的设计是采用单选框,这个时候你开始测试,那么这些工具记录的就是你的单项选择动作,但是如果你的设计发生了变化,比如说我改成了下拉选择,或者使用文本框接受用户输入,这时候,你以前录制的测试过程就无效了,必须要重新录制。
      而HttpUnit因为关注点是这些控件的内容,所以不管你的外在表现形式如何变化,都不影响你已确定测试的可重用性。
      更多的关于httpunit的信息请访问httpunit的主页http://httpunit.sourceforge.net
      案例如下:
    1. package HttpUnit.com.jerry;

    2.   

    3.   

    4.   import static org.junit.Assert.*;

    5.   

    6.   

    7.   import java.io.IOException;

    8.   

    9.   

    10.   import org.junit.Before;

    11.   import org.junit.Test;

    12.   import org.xml.sax.SAXException;

    13.   

    14.   

    15.   import com.meterware.httpunit.GetMethodWebRequest;

    16.   import com.meterware.httpunit.HttpUnitOptions;

    17.   import com.meterware.httpunit.PostMethodWebRequest;

    18.   import com.meterware.httpunit.WebConversation;

    19.   import com.meterware.httpunit.WebLink;

    20.   import com.meterware.httpunit.WebRequest;

    21.   import com.meterware.httpunit.WebResponse;

    22.   

    23.   

    24.   public class WebTest {

    25.     private  WebConversation wc;

    26.     @Before

    27.     public void setUp(){

    28.       wc = new WebConversation();

    29.     }

    30.   

    31.   

    32.     @Test

    33.     public void testEBusiness() throws IOException, SAXException {

    34.       HttpUnitOptions.setScriptingEnabled(false);

    35.       String username = "cindy";

    36.       String password = "123456";

    37.       WebRequest req = new PostMethodWebRequest("http://127.0.0.1:8000/login_action/");

    38.       //给请求加上参数

    39.       req.setParameter("username",username);

    40.       req.setParameter("password",password);

    41.       //获取响应对象

    42.       WebResponse resp = wc.getResponse(req);

    43.       //用getText方法获取相应的全部内容

    44.       assertTrue(resp.getText().contains("购物车"));

    45.     }

    46.     

    47.     @Test

    48.     public void test3testing() throws IOException, SAXException {

    49.       HttpUnitOptions.setScriptingEnabled(false);

    50.       String CheckWord = "测试";

    51.       WebResponse req = wc.getResponse("http://www.3testing.com/include/head.htm");

    52.       WebLink link = req.getLinkWith("我的课程");

    53.       link.click();

    54.       WebResponse nextLink = wc.getCurrentPage();

    55.       assertTrue(nextLink.getText().contains(CheckWord));

    56.     }

    57.   

    58.   }
    复制代码

    2、DbUnit
      DbUnit设计理念
      熟悉单元测试的开发人员都知道,在对数据库进行单元测试时候,通常采用的方案有运用模拟对象(mock objects)和stubs两种。通过隔离关联的数据库访问类,比如JDBC的相关操作类,来达到对数据库操作的模拟测试。然而某些特殊的系统,比如利 用了EJB的CMP(container-managed persistence)的系统,数据库的访问对象是在最底层而且很隐蔽的,那么这两种解决方案对这些系统就显得力不从心了。
      DBUnit的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态;而且又因为DBUnit是对JUnit的一种扩展,开发人员可以通过创建测试用例代码,在这些测试用例的生命周期内来对数据库的操作结果进行比较。
      DbUnit测试基本概念和流程
      基于DbUnit 的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。
      可以将数据库模式的全部内容表示为单个IDataSet 实例。这些表本身由Itable 实例来表示。
      ·IDataSet 的实现有很多,每一个都对应一个不同的数据源或加载机制。最常用的几种 IDataSet实现为:
      ·FlatXmlDataSet:数据的简单平面文件 XML 表示
      ·QueryDataSet:用 SQL 查询获得的数据
      ·DatabaseDataSet:数据库表本身内容的一种表示
      ·XlsDataSet :数据的excel表示
      ·DBUnit支持的数据库包括,db2,h2,hsqldb,mckoi,mssql,mysql,netezza,oralce,postgresql.
      DBUnit测试流程
      1.一般而言,使用DbUnit进行单元测试的流程如下:
      2.根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。
      3.在setUp()方法里边备份数据库中的关联表。
      4.在setUp()方法里边读入准备数据。
      5.对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。
      6.在tearDown()方法里边,把数据库还原到测试前状态。
      案例如下:
    1. AbstractDbUnitTestCase.java

    2.   package DbUnit.com.jerry;

    3.   

    4.   

    5.   import static org.junit.Assert.*;

    6.   

    7.   

    8.   import java.io.FileInputStream;

    9.   import java.io.InputStream;

    10.   import java.io.InputStreamReader;

    11.   import java.io.Reader;

    12.   import java.sql.Connection;

    13.   import java.sql.DriverManager;

    14.   

    15.   

    16.   import org.dbunit.dataset.IDataSet;

    17.   import org.dbunit.dataset.ReplacementDataSet;

    18.   import org.dbunit.dataset.xml.FlatXmlDataSet;

    19.   import org.dbunit.ext.hsqldb.HsqldbConnection;

    20.   import org.junit.AfterClass;

    21.   import org.junit.BeforeClass;

    22.   

    23.   

    24.   public abstract class AbstractDbUnitTestCase {

    25.     

    26.     public static final String USER_FIRST_NAME = "Jeffrey";

    27.     public static final String USER_LAST_NAME = "Lebowsky";

    28.     public static final String USER_USERNAME = "ElDuderino";

    29.     

    30.     protected static UserDaoJdbcImpl dao = new UserDaoJdbcImpl();

    31.     protected static Connection connection;

    32.     protected static HsqldbConnection dbunitConnection;

    33.     

    34.     @BeforeClass

    35.     public static void setupDatabase() throws Exception {

    36.     String driverName="com.mysql.jdbc.Driver";

    37.     String userName="root";

    38.     String userPasswd="123456";

    39.     String dbName="hr";

    40.     String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;

    41.       Class.forName(driverName).newInstance();

    42.       connection = DriverManager.getConnection(url);

    43.       dbunitConnection = new HsqldbConnection(connection,null);

    44.       dao.setConnection(connection);

    45.       dao.createTables();

    46.     }

    47.   

    48.   

    49.     @AfterClass

    50.     public static void closeDatabase() throws Exception {

    51.       if ( dbunitConnection != null ) {

    52.         dao.dropTables();

    53.         dbunitConnection.close();

    54.         dbunitConnection = null;

    55.       }

    56.     }

    57.     

    58.     public static IDataSet getDataSet(String name) throws Exception {

    59.       InputStream inputStream = new FileInputStream(name);

    60.       assertNotNull("file " + name + " not found in classpath", inputStream );

    61.       Reader reader = new InputStreamReader(inputStream);

    62.       FlatXmlDataSet dataset = new FlatXmlDataSet(reader);

    63.       return dataset;

    64.     }

    65.     

    66.     public static IDataSet getReplacedDataSet(String name, long id) throws Exception {

    67.       IDataSet originalDataSet = getDataSet(name);

    68.       return getReplacedDataSet(originalDataSet, id);

    69.     }

    70.     

    71.     public static IDataSet getReplacedDataSet(IDataSet originalDataSet, long id) throws Exception {

    72.       ReplacementDataSet replacementDataSet = new ReplacementDataSet(originalDataSet);

    73.       replacementDataSet.addReplacementObject("[ID]", id);

    74.       replacementDataSet.addReplacementObject("[NULL]", null);

    75.       return replacementDataSet;

    76.     }

    77.     

    78.     public static User newUser() {

    79.         User user = new User();

    80.         user.setFirstName(USER_FIRST_NAME);

    81.         user.setLastName(USER_LAST_NAME);

    82.         user.setUsername(USER_USERNAME);

    83.         return user;

    84.       }

    85.     

    86.     public static void assertUser(User user) {

    87.         assertNotNull(user);

    88.         assertEquals(USER_FIRST_NAME, user.getFirstName());

    89.         assertEquals(USER_LAST_NAME, user.getLastName());

    90.         assertEquals(USER_USERNAME, user.getUsername());

    91.       }

    92.      

    93.   }
    复制代码
    UserDaoJdbcImplTest.java
    1. package DbUnit.com.jerry;

    2.   

    3.   

    4.   import static org.junit.Assert.*;

    5.   

    6.   

    7.   import org.dbunit.Assertion;

    8.   import org.dbunit.dataset.IDataSet;

    9.   import org.dbunit.operation.DatabaseOperation;

    10.   import org.junit.Test;

    11.   

    12.   

    13.   public class UserDaoJdbcImplTest extends AbstractDbUnitTestCase{

    14.     

    15.     @Test

    16.     public void testGetUserById() throws Exception {

    17.       IDataSet setupDataSet = getDataSet("Test/DbUnit/com/jerry/user.xml");

    18.       DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);

    19.       User user = dao.getUserById(1);

    20.       assertNotNull( user);

    21.       assertEquals( "Jeffrey", user.getFirstName() );

    22.       assertEquals( "Lebowsky", user.getLastName() );

    23.       assertEquals( "ElDuderino", user.getUsername() );

    24.     }

    25.   

    26.   

    27.     

    28.     @Test

    29.     public void testAddUseIgnoringId() throws Exception {

    30.       IDataSet setupDataSet = getDataSet("Test/DbUnit/com/jerry/user.xml");

    31.       DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);

    32.       User user = newUser();

    33.       int id = dao.addUser(user);

    34.       assertTrue(id>0);

    35.       IDataSet expectedDataSet = getDataSet("Test/DbUnit/com/jerry/user.xml");

    36.       IDataSet actualDataSet = dbunitConnection.createDataSet();

    37.       Assertion.assertEqualsIgnoreCols( expectedDataSet, actualDataSet, "users", new String[] { "id" } );

    38.     }

    39.     

    40.     @Test

    41.     public void testGetUserByIdReplacingIds() throws Exception {

    42.     int id = 42;

    43.       IDataSet setupDataset = getReplacedDataSet("Test/DbUnit/com/jerry/user-token.xml", id );

    44.       DatabaseOperation.INSERT.execute(dbunitConnection, setupDataset);

    45.       User user = dao.getUserById(id);

    46.       assertUser(user);

    47.     }

    48.     

    49.     @Test

    50.     public void testAddUserReplacingIds() throws Exception {

    51.       IDataSet setupDataSet = getDataSet("Test/DbUnit/com/jerry/user-token.xml");

    52.       DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);

    53.       User user = newUser();

    54.       int id = dao.addUser(user);

    55.       assertTrue(id>0);

    56.       IDataSet expectedDataSet = getReplacedDataSet(setupDataSet, id );

    57.       IDataSet actualDataSet = dbunitConnection.createDataSet();

    58.       Assertion.assertEquals( expectedDataSet, actualDataSet );

    59.     }

    60.     

    61.   }
    复制代码
     user-token.xml
    1. <?xml version="1.0"?>

    2.   <dataset>

    3.     <users id="[ID]" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />

    4.   </dataset>
    复制代码
    user.xml
    1. <?xml version="1.0"?>

    2.   <dataset>

    3.     <users id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />

    4.   </dataset>
    复制代码








    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-19 06:43 , Processed in 0.060268 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表