开发区域

MATLAB的高级软件开发

你所有的(数据)库都属于我们

今天我要介绍的是第一次写博客的Tim Johns。Tim是我们英国办公室的顾问,他有丰富的经验,利用MATLAB的力量生产应用程序。他在这里强调了他开发的一个强大的工作流,并与大家分享了用于数据库测试的工作流。蒂姆,把它拿走!

您需要自动测试!

在过去一年左右的时间里,我和我的几个咨询团队的同事一直在与我们的一个客户一起工作,在MATLAB®中进行一个大型软件开发项目——6万行代码,来自3个国家的10多名开发人员。由此产生的应用程序正被世界各地的客户使用。我可以很轻松地说,如果没有自动化测试,我们就会完全失败!

该应用程序执行大量数据分析。要做到这一点,它必须连接到企业数据库。这就产生了一个难题:

我们如何根据数据库自动进行测试?

在编写这样的数据处理应用程序时,有时需要对数据库进行测试。嘲笑可以并且应该在单元级别使用,但是随着您进入集成测试,需要一个有代表性的系统。那么问题来了,测试的对象是什么?

使用生产数据库是绝对不可以的:就像在不关闭主电源的情况下对房子进行电气工作一样,您迟早会受到严重的电击。

更好的选择是在单独的服务器上或在每台开发机器上本地运行测试数据库。这在生产和开发工作之间创建了一个清晰的分离,但是也有一些缺点。

“胖”测试服务器的缺点

中央测试服务器:

  • 可能由你的IT部门管理,他们(正确地!)不会给你自由支配的权力。特别是在早期开发期间,数据库设计可能需要快速迭代。
  • 将需要处理多个用户同时对其运行测试而不产生争用。

在每台开发机器上本地运行都是重量级的安装,即使IT部门允许这样做,在这两种情况下,您能确信您没有在不经意间更改服务器上影响后续测试运行的内容吗?

解决方案:使用暂态数据库

我们提出的解决方案是旋转并填充数据库服务器的实例码头工人®容器在这个时候它是需要的。通过这种方式,您可以保证您已经为测试准备了一个干净的数据库,并且无论测试可能出现多大的错误,它都将在最后得到清理!

Docker正迅速成为标准的DevOps工具。与数据库服务器的完整本地安装相比,Docker安装是轻量级的。

介绍我们的数据库测试框架

我们为解决这个问题而开发的数据库测试框架是现在可在文件交换让你习惯。它可以帮助你做一些事情:

  1. 我们已经设计了Docker命令来在正确的状态下启动正确的容器。目前我们发布了Microsoft SQL Server®2017和2019以及PostgreSQL®的实现。我们对SQLite也有相同的功能,尽管这实际上不需要Docker。
  2. 我们已经提供了代码作为共享的测试夹具使用您自己的测试可以继承的相应测试类。作为一个共享的设备,可以减少数据库被设置和拆除的次数对测试套件进行排序),最大化效率-但是你的责任是不要写有漏洞的测试!
  3. 其他功能包括检查点(将数据库恢复到设置的状态)和加载备份文件。例如,如果希望调试生产中的问题,可以使用此方法。
  4. 每个数据库服务器实例使用的端口从默认端口更改为另一个空闲端口。这允许多个测试套件同时独立运行。例如,您可能希望并行运行您的测试,或者您的CI系统可能同时执行多个作业。

开始

您将需要数据库工具箱™运行此代码。安装数据库测试框架从文件交换。此工具箱目前仅在Windows上支持,因此请确保在W万博1manbetxindows机器上执行此操作。接下来,确保为要使用的数据库安装了相关的驱动程序(Microsoft SQL ServerPostgreSQL).最后,如果您还没有,请下载并安装码头工人的桌面以及Linux的Windows子系统。

工具箱中包含了一套完整的指令,但是这里有一些基本的命令可以帮助您开始使用。这里我们将使用一个交互式测试会话,但通常情况下您会希望使用基于类的方法。

建立数据库和连接

首先,我们运行以下命令在Docker中设置数据库并建立连接:

tc = dbtest.WithMsSqlServer2019.forInteractiveUseWithAutoSetup ()
EULA: https://hub.docker.com/_/microsoft-mssql-server [13-11-2020 11:49:45] trying create container: Source=lh:55430_13-11_11:49:45.568, Port=55430 [13-11-2020 11:49:48] Attempt [01] Waiting for container to initialized [13-11-2020 11:49:53] Attempt [02] Waiting for container to initialized [13-11-2020 11:49:58] Attempt [03] Waiting for container to initialized [13-11-2020 11:50:03] Attempt [04] Connected:花了16.5秒运行安装程序Fcn…已完成设置的数据库tc = WithMsSqlServer2019属性:DatabaseConnection: [1×1 database.odbc。CheckpointNames: [1×0 string] TableNames: [0×1 string]

向数据库写入一些数据

接下来,我们将创建一个简单的表并将其写入数据库:

台=表(“蝙蝠侠”, 35岁,“男性”, 200,“高谭市”“VariableNames”...“姓”“年龄”“性别”“高度”“位置”})
台表LastName = 1×5年龄性别身高的位置  ________ ___ ______ ______ ________ " 蝙蝠侠“35”男“200”高谭市”
tc.DatabaseConnection.sqlwrite (“角色”(资源);

再次检索数据

现在我们将从数据库中取回数据,并检查它是否与我们发送的数据相同:

tc.DatabaseConnection.sqlread (“角色”
ans LastName = 1×5表年龄性别身高的位置  __________ ___ ________ ______ __________ {' 蝙蝠侠200年35{‘男性’}}{“高谭市”}

利用检查点

框架内建的特性之一是在数据库中创建检查点的能力,您可以在稍后的时间点恢复到该检查点。当您希望为一个测试套件设置一次数据库,但在每个测试点开始时数据库都处于相同的状态时,这非常有用。

让我们创建一个名为“BatmanOnly”的检查点:

tc.createCheckpoint (“BatmanOnly”);

现在我们将向数据库中的表添加更多的数据:

资源描述。LastName =“罗宾”;tc.DatabaseConnection.sqlwrite (“角色”(资源);tc.DatabaseConnection.sqlread (“角色”
ans LastName = 2×5表年龄性别身高的位置  __________ ___ ________ ______ __________ {' 蝙蝠侠200年35{‘男性’}}{“高谭市”}{“罗宾”}35{‘男性’}200{“高谭市”}

现在我们将数据库恢复到" BatmanOnly "检查点:

tc.restoreCheckpoint (“BatmanOnly”) tc.DatabaseConnection.sqlread (“角色”
ans LastName = 1×5表年龄性别身高的位置  __________ ___ ________ ______ __________ {' 蝙蝠侠200年35{‘男性’}}{“高谭市”}

清理!

最后,我们将从工作区中清除到数据库的连接。因为它不再被使用,它会自动删除连接,并停止并删除Docker中的容器:

清晰的tc
[13-11-2020 11:50:16]试图拆除集装箱:Source=lh:55430_13-11_11:49:45.568, Port=55430

轮到你!

获取数据库测试框架工具箱文件交换GitHub你自己去试试吧!请在下面的评论中告诉我你的看法。




发布与MATLAB®R2020b

|

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。