Java使用存储过程检查数据库数据
在开发和测试阶段,需要编写单元测试、集成测试自动化测试。编写自动化测试时需要用到假数据去测试特定的功能,我们可以使用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)
)
BEGIN
DECLARE 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 SQLEXCEPTION
BEGIN
SET iErrorCode := 3, sErrorMsg := '数据库错误';
ROLLBACK;
END;
START TRANSACTION;
OPEN list;
read_loop: LOOP
FETCH list INTO iCommodityID, iStatus;
IF done THEN
LEAVE read_loop;
END IF;
-- 检查检查所有商品的状态,状态只能为0,1,2
IF iStatus IN (0,1,2) THEN
SET 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)
)
BEGIN
DECLARE 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 SQLEXCEPTION
BEGIN
SET iErrorCode := 3, sErrorMsg := '数据库错误';
ROLLBACK;
END;
START TRANSACTION;
OPEN list;
read_loop: LOOP
FETCH list INTO iCommodityID, iType;
IF done THEN
LEAVE read_loop;
END IF;
-- 只有单品可以被盘点
IF EXISTS(SELECT 1 FROM t_inventorycommodity WHERE F_CommodityID = iCommodityID) AND iType <> 0 THEN
SET 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());
}
}

浙公网安备 33010602011771号