基于Java访问Hive的JUnit5测试代码实现

简介: 根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下

根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下(做了修改):

代码语言:javascript

复制

package com.jerry;
           
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
           
public class HiveClient {
    private static final String DRIVER_CLASS = "org.apache.hive.jdbc.HiveDriver";
    private static final String CONNECTION_URL = "jdbc:hive2://192.168.31.184:10000/demo";
    private static PreparedStatement preparedstatement;
    private static Statement statement;
    private static ResultSet resultSet = null;    
           
    //建立连接
    Connection getConnection() throws SQLException {
        try {
            Class.forName(DRIVER_CLASS);
            Connection con = DriverManager.getConnection(CONNECTION_URL);
            statement = con.createStatement();
            return con;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new SQLException(e.getMessage());
        }
    }
    
    //断开连接
    public void disconnect(Connection con) throws SQLException {
           // Close resources
        resultSet.close();
        statement.close();
        con.close();
    }    
    
    //根据query查询
    public ResultSet query(String query) throws SQLException {
           // Execute a query
        resultSet = statement.executeQuery(query);
        return resultSet;
    }
    
    //条件查询
    public ResultSet query(Connection con,String query,Mapcondition) throws SQLException {
           String where = " where ";
           int i = 0;
           int length = condition.size(); 
           String[] valuearray= new String[length];
           for (String key : condition.keySet()) {
                   String value = condition.get(key);
                   where = where+key+" = ? AND ";
                   valuearray[i] = value;
                   i++;
           }
           where = where + "1=1";    
           query = query + where;
           PreparedStatement preparedStatement = con.prepareStatement(query);
           for(int j=0;j
                  preparedStatement.setString(j+1, valuearray[j]);
           }
           resultSet = preparedStatement.executeQuery();
           return resultSet;
    }
    
    //打印查询记录
    public void printQueryResult(Connection con,String query,Mapcondition) throws SQLException {
           ResultSet resultSet = query(con,query,condition);
           //获取 ResultSet 的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        // 获取列数
        int columnCount = metaData.getColumnCount();
              while (resultSet.next()) {
                     for (int i=1;i<=columnCount;i++) {
                            System.out.print(resultSet.getString(i)+",");
                     }    
                     System.out.println("");
        }
    }
    
    //查询并且打印数据
    public void printQueryResult(String query) throws SQLException {
           ResultSet resultSet = query(query);
           //获取 ResultSet 的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        // 获取列数
        int columnCount = metaData.getColumnCount();
              while (resultSet.next()) {
                     for (int i=1;i<=columnCount;i++) {
                            System.out.print(resultSet.getString(i)+",");
                     }
                     System.out.println("");
        }
    }
    
    //查询并且打印数据
    public void queryAndPrint(String query) throws SQLException {
           printQueryResult(query);    
    }
    
    //查询并且打印数据
    public void queryAndPrint(Connection con,String query,Mapcondition) throws SQLException {
           printQueryResult(con,query,condition);
    }
    
    //添加数据
    public void addDataToHiveTable(Connection con,String tableName,String[] newValue) {
        try {
               String insertSql = "INSERT INTO person SELECT ?,?,?,"+newValue[3]+","+newValue[4];
               preparedstatement = con.prepareStatement(insertSql);
               preparedstatement.setInt(1, Integer.parseInt(newValue[0]));
               preparedstatement.setString(2, newValue[1]);
               preparedstatement.setInt(3, Integer.parseInt(newValue[2]));
               preparedstatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }    
    }
    
    //将文件中的数据加载到表中
    public void loadDataForLocal(String tableName,String path) throws SQLException {
           String query = "LOAD DATA LOCAL INPATH '"+path+"' INTO TABLE "+tableName;
           statement.execute(query);
           
    }
    
    //清空数据表
    public void truncateTable(Connection con,String tableName) throws SQLException {
           String query = "truncate table "+tableName;
           con.setAutoCommit(true); 
           Statement statement = con.createStatement();
           statement.execute(query);
    } 
}

现在,使用JUnit5来进行测试。

1)建立类全局变量

代码语言:javascript

复制

public class HiveClientTest {
    //被测类
    private static HiveClient hive = new HiveClient();
    //数据库连接
    private static Connection con;
    //存在的表名
    private static String tableName = "person";
    //不存在的表名,用于错误测试用例开发
    private static String errorTableName = "myperson";
    //正确的查询语句
    private static String query = "SELECT * FROM "+tableName;
    //错误的查询语句(查询语句中的表不存在)
    private static String errorQuery = "SELECT * FROM "+errorTableName;
    //导入数据路径
    private static String inpath = "/home/jerry/hive/person";

2)建立@BeforeClass和@AfterClass函数

代码语言:javascript

复制

//所有测试用例执行之前运行
  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    //建立连接
    con = hive.getConnection();    
    //从导入数据路径中导入数据,作为基础测试数据
    hive.loadDataForLocal(tableName,inpath);
  }
           
  //所有测试用例执行之后运行
   @AfterClass
    public static void tearDownAfterClass() throws Exception {
    //清空测试数据
    hive.truncateTable(con,tableName);
    //断开链接
    hive.disconnect(con);
  }

3)测试查询

代码语言:javascript

复制

//测试根据Query查询
@Test
public void testQuery() {
       try {
        //获得查询结果
        ResultSet resultSet = hive.query(query);
        //遍历查询结果
        while (resultSet.next()) {
            //验证编号行是不是数字    
            assertThat(resultSet.getInt(1),instanceOf(Integer.class));
           //验证姓名行是不是包含字符串"elite"
            assertTrue(resultSet.getString(2), resultSet.getString(2).contains("elite"));
            //验证年龄行是不是数字
            assertThat(resultSet.getInt(3),instanceOf(Integer.class));
            //验证爱好行是不是为"[\"basketball\",\"music\",\"dance\"]"
            assertEquals("[\"basketball\",\"music\",\"dance\"]",resultSet.getString(4));
            //验证地址行是不是为"{\"address\":\"xx\"}"
            assertEquals("{\"address\":\"xx\"}",resultSet.getString(5));
          }
         } catch (SQLException e) {
            // TODO Auto-generated catch block
             e.printStackTrace();
          }
          //测试错误的Query
          Assertions.assertThrows(SQLException.class, () -> hive.query(errorQuery));
       }
           
//测试根据条件查询-一个条件    
@Test
public void testQueryWitchOneCondition() {
  //构建查询条件
  Mapcondition = new HashMap();
  condition.put("name","elite0");
  try {
    //条件查询
    ResultSet resultSet = hive.query(con,query,condition);
    //遍历查询结果
    while (resultSet.next()) {
        //验证第一个匹配项
       assertEquals("elite0",resultSet.getString(2));
      //验证第二个匹配项
       assertEquals("10",resultSet.getString(3));
      }
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
           
//测试根据条件查询-两个条件
 @Test
public void testQueryWitchTwoCondition() {
  //构建查询条件
    Mapcondition = new HashMap();
    condition.put("name","elite0");
    condition.put("age","50");
    try {
        //条件查询
        ResultSet resultSet = hive.query(con,query,condition);
        //遍历查询结果
        while (resultSet.next()) {
               //验证第一个匹配项
               assertEquals("elite0",resultSet.getString(2));
                //验证第二个匹配项
               assertEquals("50",resultSet.getString(3));
         }
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  //测试错误的Query    
  Assertions.assertThrows(SQLException.class, ()-> hive.query(con,errorQuery,condition));
}
              
//测试根据条件查询-三个条件
@Test
public void testQueryWitchThreeCondition() {
    //构建查询条件
    Mapcondition = new HashMap();
    condition.put("id","0");
    condition.put("name","elite0");
    condition.put("age","50");
    try {
      //条件查询
       ResultSet resultSet = hive.query(con,query,condition);
      //遍历查询结果
      while (resultSet.next()) {
          //验证第一个匹配项
          assertEquals("0",resultSet.getString(1));
           //验证第一个匹配项
          assertEquals("elite0",resultSet.getString(2));    
           //验证第二个匹配项
          assertEquals("50",resultSet.getString(3));
        }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
  }

4)测试打印结果和查询+打印结果不发生异常

代码语言:javascript

复制

@Test
       public void testPrintQueryResult_1() {
              assertDoesNotThrow(() -> {
                     hive.printQueryResult(query);
              });
       }
       
       @Test
       public void testPrintQueryResult_2() {
              Mapcondition = new HashMap();
              condition.put("name","elite0");
              condition.put("age","50");
              assertDoesNotThrow(() -> {    
                     hive.printQueryResult(con,query,condition);
              });
       }
       
       @Test
       public void testQueryAndPrint_1() {
              assertDoesNotThrow(() -> {
                     hive.queryAndPrint(query);
              });
       }
       
       @Test
       public void testqueryAndPrint_2() {
              Mapcondition = new HashMap();
              condition.put("name","elite0");
              condition.put("age","50");
              assertDoesNotThrow(() -> {
                     hive.queryAndPrint(con,query,condition);
              });
       }

5)测试添加数据

代码语言:javascript

复制

@Test    
            public void testAddDataToHiveTable() {
            //构造插入数据
            String like = "array('basketball', 'music', 'dance')";
           String map = "map('address','xx')";
              String[] newAddValue = {"10","elite0","50",like,map};
              //插入数据
              hive.addDataToHiveTable(con,tableName,newAddValue);
              //检查插入数据是否存到数据库中
              Mapcondition = new HashMap();
              condition.put("id","10");
              condition.put("name","elite0");
              condition.put("age","50");
              ResultSet resultSet;
              try {
                     resultSet = hive.query(con,query,condition);
                     while (resultSet.next()) {
                            assertEquals("10",resultSet.getString(1));
                            assertEquals("elite0",resultSet.getString(2));
                            assertEquals(50,resultSet.getInt(3));
                            assertEquals("[\"basketball\",\"music\",\"dance\"]",resultSet.getString(4));
                            assertEquals("{\"address\":\"xx\"}",resultSet.getString(5));    
                     }
              } catch (SQLException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              }
              String[] newAddErrorValue = {"ab","elite0","cd",like,map};
              //测试ErrorValue
              Assertions.assertThrows(NumberFormatException.class, () -> hive.addDataToHiveTable(con,tableName,newAddErrorValue));
              String[] newAddErrorValue_1 = {"11","elite0","50",like};
              //测试ErrorValue
              Assertions.assertThrows(ArrayIndexOutOfBoundsException.class, () -> hive.addDataToHiveTable(con,tableName,newAddErrorValue_1));
       }
目录
相关文章
|
13天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
12天前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
23天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
2天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
5 0
|
14天前
|
机器学习/深度学习 敏捷开发 测试技术
软件测试的艺术:从代码到用户心灵的旅程
在阅读本文之前,让我们先共同思考一个问题:“为什么即使是最小的错误,也可能对用户体验和企业声誉造成巨大的影响?” 正如我们将要探讨的,软件测试不仅是技术活动的一种,更是确保产品质量、优化用户体验和维持品牌声誉的关键步骤。本文将引导您了解软件测试的基本概念,探索其背后的艺术性,以及如何高效地实施测试策略来达到最佳的质量保证结果。
25 0
|
28天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
128 7
Jmeter实现WebSocket协议的接口测试方法
|
28天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
122 3
快速上手|HTTP 接口功能自动化测试
|
1天前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
5 0
|
28天前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
32 5
|
2月前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~