在开发和测试阶段,需要编写单元测试、集成测试自动化测试。编写自动化测试时需要用到假数据去测试特定的功能,我们可以使用sql命令把假数据存入到数据库表中。但是通过这种方式插入数据,它的数据格式、表与表关联的数据不一定符合要求。使用不准确的数据运行自动化测试是无法达到测试目的的。我们可以使用存储过程来检查通过sql插入的假数据,效率也比较高,我们把这种存储过程命令为SPD。本文将介绍SPD的使用,包括:“准备向数据库插入数据的sql语句”、“编写SPD检查插入的数据是否正确”、“通过sql命令调用SPD”、"通过Java单元测试调用SPD"。

1、准备向数据库插入数据的sql语句。

准备插入数据的sql语句可以使用excel文件,方便更新维护:

2、编写SPD检查插入的数据是否正确。

检查数据库表某一个字段的存储过程。

例如检查商品的状态,商品状态status只能为0,1,2。如果status为其它的值,则认为这条数据是不健康的,需要重新修改:

DROP PROCEDURE IF EXISTS `SPD_Commodity_CheckStatus`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `SPD_Commodity_CheckStatus`(OUT iErrorCode INT,OUT sErrorMsg VARCHAR(64)
)
BEGINDECLARE iCommodityID INT;DECLARE iStatus INT;DECLARE done INT DEFAULT FALSE;-- -- 临时模板,下面list需要根据需求变化DECLARE list CURSOR FOR (SELECT F_ID AS iCommodityID, F_Status AS iStatus FROM t_commodity);DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;  DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSET iErrorCode := 3, sErrorMsg := '数据库错误';ROLLBACK;END;START TRANSACTION;OPEN list;read_loop: LOOPFETCH list INTO iCommodityID, iStatus;IF done THENLEAVE read_loop;END IF;-- 检查检查所有商品的状态,状态只能为0,1,2IF iStatus IN (0,1,2) THENSET iErrorCode := 0;SET sErrorMsg := '';ELSE SET done := TRUE;SET iErrorCode := 7;SET sErrorMsg := CONCAT('商品', iCommodityID, '的状态不正常,状态只能为0,1,2');END IF;END LOOP read_loop;CLOSE list;COMMIT;
END;

表与表之间关联数据的约束。

例如盘点商品时,不能盘点已删除状态(status为2)的商品:

DROP PROCEDURE IF EXISTS `SPD_Commodity_CheckInventory`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `SPD_Commodity_CheckInventory`(OUT iErrorCode INT,OUT sErrorMsg VARCHAR(64)
)
BEGINDECLARE iCommodityID INT;DECLARE iType INT;DECLARE done INT DEFAULT FALSE;-- -- 临时模板,下面list需要根据需求变化DECLARE list CURSOR FOR (SELECT F_ID AS iCommodityID, F_Type AS iType FROM t_commodity WHERE F_Status <> 2);DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSET iErrorCode := 3, sErrorMsg := '数据库错误';ROLLBACK;END;START TRANSACTION;OPEN list;read_loop: LOOPFETCH list INTO iCommodityID, iType;IF done THENLEAVE read_loop;END IF;-- 只有单品可以被盘点IF EXISTS(SELECT 1 FROM t_inventorycommodity WHERE F_CommodityID = iCommodityID) AND iType <> 0 THENSET done := TRUE;SET iErrorCode := 7;SET sErrorMsg := CONCAT('商品', iCommodityID ,'不是单品,不能被盘点');-- 没有盘点单就不用检查,单品也有没有盘点单都行ELSE SET iErrorCode := 0;SET sErrorMsg := '';END IF;END LOOP read_loop;CLOSE list;COMMIT;
END;

3、通过sql命令调用SPD。

SELECT '++++++++++++++++++ Test_SPD_Commodity_CheckStatus.sql ++++++++++++++++++++';SELECT '-------------------- Case1:正常测试 -------------------------' AS 'Case1';
--
SET @iErrorCode = 0;
SET @sErrorMsg = '';
--
CALL SPD_Commodity_CheckStatus(@iErrorCode, @sErrorMsg);
SELECT @iErrorCode, @sErrorMsg;
--
SELECT IF(@sErrorMsg = '' AND @iErrorCode = 0, '测试成功', '测试失败') AS 'Case1 Testing Result';SELECT '-------------------- Case2:商品状态不是0,1,2 -------------------------' AS 'Case2';
INSERT INTO T_Commodity (F_Status,F_Name,F_ShortName,F_Specification,F_PackageUnitID,F_PurchasingUnit,F_BrandID,F_CategoryID,F_MnemonicCode,F_PricingType,
F_LatestPricePurchase,F_PriceRetail,F_PriceVIP,F_PriceWholesale,F_CanChangePrice,F_RuleOfPoint,F_Picture,
F_ShelfLife,F_ReturnDays,F_CreateDate,F_PurchaseFlag,F_RefCommodityID,F_RefCommodityMultiple,F_Tag, F_NO,F_Type)
VALUES (-1,'星巴克AB123','咖啡123','个',4,'支',4,4,'SP',1,
5,38,5.8,5.5,1,1,null,
3,30,'2019-01-14','20',0,0,'星巴克AB',0,0);
SET @iCommodityID = LAST_INSERT_ID();
--
SET @iErrorCode = 0;
SET @sErrorMsg = '';
--
CALL SPD_Commodity_CheckStatus(@iErrorCode, @sErrorMsg);
SELECT @iErrorCode, @sErrorMsg;
--
SELECT IF(@sErrorMsg = CONCAT('商品', @iCommodityID, '的状态不正常,状态只能为0,1,2') AND @iErrorCode = 7, '测试成功', '测试失败') AS 'Case2 Testing Result';
--
DELETE FROM t_commodity WHERE F_ID = @iCommodityID;

4、通过Java单元测试调用SPD。

private static void Doctor_checkStatus(CommodityMapper commodityMapper) {Shared.printTestClassEndInfo();Map<String, Object> params = new HashMap<String, Object>();DataSourceContextHolder.setDbName(Shared.DBName_Test);commodityMapper.checkStatus(params);if (EnumErrorCode.values()[Integer.parseInt(params.get(BaseAction.SP_OUT_PARAM_iErrorCode).toString())] != EnumErrorCode.EC_NoError) {System.out.println("检查的商品状态的错误码不正确,errorCode =" + EnumErrorCode.values()[Integer.parseInt(params.get(BaseAction.SP_OUT_PARAM_iErrorCode).toString())]);}if (!params.get(BaseAction.SP_OUT_PARAM_sErrorMsg).toString().equals("")) {System.out.println("检查的商品状态的错误信息与预期中的错误信息不相符,errorMsg=" + params.get(BaseAction.SP_OUT_PARAM_sErrorMsg).toString());}}

Java使用存储过程检查数据库数据相关推荐

  1. maven的java工程取mysql数据库数据

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  2. java excel批量导入数据库数据_Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  3. 【java】批量插入数据库数据

    在项目中往往需要一次向数据库中插入多条数据,如果使用for循环的方式插入,效率慢且资源消耗高 接下来看看如何批量将数据写入数据库中 一.Dao ReportSampleDao.java文件 impor ...

  4. java删除选中行数据库数据_删除DataGridView选中行并更新数据库

    前面写过一篇文章是DataGridView控件显示数据的,DataGridView在与数据库打交道时会经常出现,也很实用.通过DataGridView对数据库进行更改和查询都比较方便. 这里我们需要用 ...

  5. 利用Java存储过程简化数据库操作

       利用Java存储过程沟通SQL.XML.Java.J2EE和Web服务. 存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来. ...

  6. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  7. mysql java datetime_Java向mysql数据库插入datetime类型数据实例(精)

    在Mysql数据库中日期跟时间有两种: 1.date类型,date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期, 2.dateitme就是可以储存日期同时 ...

  8. highcharts加载数据库数据(java版)

    前段时间因为项目需要使用了highcharts报表,新手可以参考http://www.hcharts.cn/,教程中有比较详细的介绍和demo.但是demo中的例子的数据都是静态数据,而在实际项目中一 ...

  9. oracle往mysql数据同步存储过程_Oracle数据库之间数据同步

    源库(ENV库)中定义如下包: 包定义如下: CREATE OR REPLACE PACKAGE PKG_DATA_REPORT IS - Author : JOHNFNASH - Created : ...

最新文章

  1. IPv4的核心管理功能/proc/sys/net/ipv4/*
  2. SpringMVC拦截器HandlerInterceptor原理及使用
  3. 【VMC实验室】在QCloud上创建您的SQL Cluster(5)
  4. Android 自定义组合控件 简单导航栏
  5. w3cschool菜鸟教程php,JS实例学习笔记——w3cschool+菜鸟教程
  6. Ubuntu 18.04安装c++版OpenCV4
  7. 最新消息:原谷歌中国副院长刘骏任职人民搜索首席科学家
  8. 测试网站速度的8款免费工具推荐
  9. android js 双指事件,移动端touch事件--点击、双指与拖拽
  10. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月8日~8月14日)...
  11. 怎么扫描图片存为电子版?只需要几步小操作
  12. java23种设计模式面试常被问到的单利模式讲解
  13. 职业生涯规划之自我探索论文
  14. 加密解密及其javascript实现
  15. 聪明点 比较购物网站SEO分析
  16. 【Python自动化制作PPT材料(模仿人工操作)】
  17. python opencv bgr转rgb_RGB最新:opencv-python的RGB与BGR互转方式_爱安网 LoveAn.com
  18. spring 常见面试题
  19. 对亮神基于白名单Mshta.exe 执行 payload 第五季复现
  20. dede网站首页被黑攻击植入恶意跳转代码怎么办? 首页经常被篡改标题关键字的解决方法

热门文章

  1. 围棋棋盘怎么编程python_python3 turtle 画围棋棋盘
  2. VMware workstation 14 入门到精通-臧雪园-专题视频课程
  3. python爬虫模块request_Python爬虫——Request模块
  4. android 小插件开发,Android Gradle 插件开发指南
  5. Jmeter书中不会教你的(25)——快递时效查询实战6写入csv文件
  6. CSS常用选择器(通配符选择器,标签选择器,类选择器,id选择器.....),你知道多少?
  7. 【计算机毕业设计】Java ssm XX活动报名系统(源码+论文)
  8. Golang 编辑器
  9. 从零开始之驱动发开、linux驱动(六十四、内核调试篇--基础知识2[console的建立])
  10. dbeaver安装和使用教程