开发区域

使用MATLAB先进的软件开发

所有(数据)基础都属于我们

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

您需要自动测试!

在过去一年左右的时间里,我和咨询团队的几个同事一直在与我们的一个客户合作,在MATLAB®中进行一个大型软件开发项目——60000行代码,来自3个国家的10多名开发人员。所得到的应用程序正在被全世界的客户使用。我可以很容易地说,如果没有自动化测试,我们将完全迷失!

该应用程序执行大量数据分析。为此,它必须连接到企业数据库。这提出了一个难题:

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

在编写此类数据处理应用程序时,请在某个时刻最终需要测试数据库。嘲笑可以并且应该在单元级别上使用,但是当您进入集成测试时,需要一个代表性的系统。接下来的问题是,测试对象是什么?

使用生产数据库是绝对的NO-NO:非常喜欢在您房子上执行电气工作而不关闭主要电源,您将在早晚享受令人讨厌的震惊。

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

“胖”测试服务器的缺点

中央测试服务器:

  • 可以由您的IT部门管理谁(正确!)不会给你免费统治。特别是在早期发展中,数据库设计可能需要迅速迭代。
  • 将需要处理多个用户同时对其运行测试而没有争用。

在每台开发机器上本地运行是一个重量级的安装,即使IT允许这样做,而且在这两种情况下,您能确信您没有无意中更改服务器上的某些东西,从而影响后续的测试运行吗?

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

我们提出的解决方案是在Docker®容器目前需要的那一刻。这样你可以保证你已经准备好了一个干净的数据库进行了测试,无论考试如何运行多么错误,都会在最后进行清理!

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

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

为了解决这个问题,我们开发的数据库测试框架是现在在文件交换中可用让你使用。它有助于您做一些事情:

  1. 我们已经完成了Docker命令,以便为您发出正确的状态。目前我们正在为Microsoft SQLServer®2017和2019以及PostgreSQL®运送实现。我们对SQLite的功能也具有相同的功能,虽然这实际上并不需要Docker。
  2. 我们提供的代码是共享的测试夹具使用相应的测试类,您自己的测试可以从中继承。作为一个共享装置,可以将数据库安装和关闭的次数降到最低(如果您已经安装和关闭了数据库)整理您的测试套件),最大限度地提高效率 - 但Onus是在您不要写泄漏的测试!
  3. 其他功能包括检查点(将数据库恢复到设置状态)和加载备份文件。例如,如果您想调试来自生产环境的问题,可以使用此功能。
  4. 每个数据库服务器实例使用的端口从缺省更改为另一个空闲端口。这允许多个测试套件同时独立运行。例如,您可能希望并行运行测试,或者您的CI系统可能同时执行多个作业。

开始

你需要的Database Toolbox™运行此代码。安装数据库测试框架来自文件交换。此工具箱目前仅在Windows上支持,因此请务必从W金宝appindows计算机执行此操作。接下来,确保您拥有要使用的数据库的相关驱动程序(Microsoft SQL ServerPostgreSQL.).最后,如果还没有,请下载并安装Docker桌面Windows子系统和Linux系统。

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

建立数据库和连接

首先,我们将运行命令来在Docker中设置数据库并建立与IT的连接:

tc = dbtest.WithMsSqlServer2019.forInteractiveUseWithAutoSetup ()
EULA: https://hub.docker.com/_/microsoft-mssql-server[13- 11 -2020 11:49:45]试图创建容器:Source=lh:55430_13-11_11:49:45.568, Port=55430 [13- 11 -2020 11:49:48] Attempt [01] Waiting for container to be initialized [13- 11 -2020 11:49:53] Attempt [02] Waiting for container to be initialized [13- 11 -2020 11:49:58] Attempt [03] Waiting for container to be initialized [13- 11 -2020 11:50:03] Attempt [04] Connected:花了16.5秒运行Setup 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 (“角色”,TBL);

再次检索数据

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

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

利用检查点

内置框架中内置的功能之一是在数据库中创建检查点,可以在稍后及时恢复到。当您希望为测试套件设置一次,但在同一状态下使用数据库启动每个测试点时,这真的很有用。

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

tc.createCheckpoint (“BatmanOnly”);

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

资源描述。LastName =“罗宾”;tc.DatabaseConnection.sqlwrite (“角色”,TBL);tc.databaseConnection.sqlread(“角色”
ans = 2×5表姓氏年龄性别高度地点__________ ______________________________________________·男性'} {'GOTHAM'} {'MEAL'} 200 {'GOTHAM'}

现在我们将把数据库恢复到“只有蝙蝠侠”检查点:

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

清理!

最后,我们将清除与工作区数据库的连接。由于它不再使用,它​​将自动删除连接,并停止并卸下Docker中的容器:

清晰的TC.
[13-Nov-2020 11:50:16] trying to tear down container: Source=lh:55430_13-11_11:49:45.568, Port=55430

轮到你!

从中获取数据库测试框架工具箱文件交换GitHub.和自己一起去!让我知道你是如何在下面的评论中进入。




MATLAB®R2020b发布

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。