开发区域

先进与MATLAB软件开发

标签,你!

我发现与任何合理大小的软件项目中,迟早组织变得很重要。作为额外的特性和功能是引入一个工具箱就重要的快速、轻松地得到正确的代码对手头的任务。当我们谈论这些软件产品,通常一段代码是“双重职责”。下载188bet金宝搏对于这些并不少见,一个类或函数或方法推广到正确提供许多用例。

我们如何缩小这些片段代码?当然测试!而单一的源代码可能是一般足以满足许多用例,确保每个用例的测试应编写和用户可见的功能工作正常。换句话说,如果你想要每个用例覆盖,它最好有相应的测试,即使实现了通过一些广义机制在源代码中。

好吧,简单。我们将使用测试,它永远是琐碎来定位特定的测试我们需要对吧?恩,不。测试本身是源代码并将有相同的问题和它们适用于透明的源代码。因为这是相当普遍的测试自己组织到一些结构,试图将他们分类,便于检索。我想运行单元测试的数字基础我的产品吗?只是去测试/数字/单位文件夹和类型runtests。如何通过我的用户界面测试,锻炼这些数字吗?也许这些都是放在tests.system.ui测试包吗?系统测试好的,也许有很多的碎片,不需要用数字但酷,处理它!

如果我想找到覆盖的测试/代码的集成分类特征和持久性?比如让你进行分类并将结果保存到某种形式的持久性数据库或垫等文件。嗯,嗯,我们如何找到这些测试吗?他们会在测试/分类测试/持久性吗?如果他们是在一个文件夹而不是其他这是否意味着这些测试文件夹是真正的“所有者”的特性,另一个不是,只是学习成绩不良和低自尊的生活吗?

不是这样的!我到这里来保护这些可怜的测试文件夹!我在这里宣布在屋顶上,如果你没有分类系统完美并不是所有的希望都是输了。我知道分类正确的事情很难做的

我们可以不再强调层次结构基于文件夹或包结构吗?而不是很好如果我们可以标记特定测试内容和元数据用于分类吗?这个元数据可以跨不同的轴,适用于测试内容的特性,或观点,与文件夹或包结构。你不能在两个文件夹的文件在同一时间。而不是让我们的组织的大部分时间花在为我们的测试代码找出最好的类别。

如果你有R2015a或者以后可以轻松使用测试标签功能测试框架。

这个测试标签功能有点像标签在Gmail™,其中您可以应用某些标签传入邮件消息,随后使用这个标签过滤你的消息。

我们怎么可能应用在我们的测试内容?

首先让我们来看看几个不同的轴,肯定会让我们陷入麻烦试图设计在一个层次结构。如果我们坚持的例子已经讨论过的那样,也许我们可能会有一些测试类,类似于下面的这些。注意这些测试包含的伪代码,不要运行以来我们正在测试的产品并不存在。

classdef(TestTags = {“分类”,“坚持不懈”})ClassificationWithPersistenceTest < matlab.unittest.TestCase%这个测试练习我的两个特性工具箱如何协同工作,即%工具箱分类特性如何持久化处理工作。方法(测试)函数testClassificationResultSavedCorrectly (testCase)%将一些数据并保存结果data =负载(“testData.mat”);分类=(数据)进行分类;classification.persist (“testFile.mat”);结果=负载(“testFile.mat”);testCase。verifyEqual(结果、分类、垫的分类不存在正确文件。”);结束结束结束

请注意这个测试类有一个额外的TestTags属性classdef块。在该属性可以列举一些标签,这将有助于识别目的的测试。在这种情况下,我们可以确定这个测试相关的“分类”“坚持不懈”特性。

这是有趣的,让我们做一些:

classdef(TestTags = {“数字”})CoreNumericsUnitTest < matlab.unittest.TestCase%是一个单元测试的核心数字我的工具箱方法(测试)函数testCoreNumerics (testCase)输入= 1:10;实际= CoreNumericEngine.analyze(输入);预期= expectedResultFromFirstPrinciples(输入);testCase。verifyEqual(实际的预期,“RelTol”、sqrt (eps));结束结束结束

现在我们有一个美丽的数字的单元测试。我们谈过的系统测试怎么样?

classdef(TestTags = {“用户界面”})AcceptanceSystemTest < matlab.unittest.TestCase%系统测试执行整个堆栈的应用重点%优先客户工作流。方法(测试,TestTags = {“坚持不懈”})函数testApplicationImportData (testCase)无花果= numericsapp;clickImportButtonAndSelect (“testFile.mat”);分类= getClassificationfromUI(图);预期=负载(“testFile.mat”);testCase。verifyEqual(分类、预期,分类数据不正确导入到应用程序。);结束结束方法(测试,TestTags = {“数字”})函数testApplicationNumericResults (testCase)无花果= numericsapp;clickAnalyzeButton(图);实际= getCurrentResult(图);预期= CoreNumericEngine.analyze (getCurrentData(图));testCase。verifyEqual(实际的预期,应用结果不匹配数字对应。);结束结束结束

这个测试是有点不同的,正如你所看到的TestTags属性不仅classdef块,但包含在测试方法阻止。最终这些标签适用于测试方法,但包括TestTags在classdef块是一种速记申请标签的所有方法的类(如果任何和所有子类)。前两个测试例子显然希望这些标记应用于类的所有方法。然而,系统测试,特别是更微妙。系统测试可以跨越完整的特性集的工具箱,它为不同的测试并不少见触摸工具箱功能的不同部分。在这种情况下,两种测试方法“用户界面”但只有其中一个处理“坚持不懈”和一个“数字”。应用标签的方法使我们能够区分这两个水平。

好了好了,这给了我们什么呢?测试选择谁呢?让我们看看我们的全套包含所有这些测试:

进口matlab.unittest.TestSuite;fullSuite = TestSuite.fromFolder (“测试”)
fullSuite = 1 x4测试数组属性:名称参数化SharedTestFixtures标签测试包括:0参数化,0共享测试夹具类、4独特的标签。

细心的读者会注意到,这实际上套件显示显示4独特的标签。如果您正在运行在MATLAB这实际上是一个超链接,向你展示了标签的完整列表包含在套件中。当点击它看起来像:

标签___________“分类”“数字”“持久性”“界面”

现在这里有一个快速的方法看到哪些测试我们正在与一套。这是一个简明的方式来的地方的名字每个套件元素到一个列单元阵列显示得很好。

{fullSuite.Name}”。
ans = ' AcceptanceSystemTest / testApplicationNumericResults ' ' AcceptanceSystemTest / testApplicationImportData ' ' ClassificationWithPersistenceTest / testClassificationResultSavedCorrectly ' ' CoreNumericsUnitTest / testCoreNumerics '

现在我们可以分割成这个套件但是我们希望根据我们的标签使用的好selectIf方法:

persistenceSuite = fullSuite.selectIf (“标签”,“坚持不懈”);{persistenceSuite.Name}”。
ans = ' AcceptanceSystemTest / testApplicationImportData ' ' ClassificationWithPersistenceTest / testClassificationResultSavedCorrectly '

它甚至支持通配符金宝app:

numericsSuite = fullSuite.selectIf (“标签”,“Num *”);{numericsSuite.Name}”。
ans = ' AcceptanceSystemTest / testApplicationNumericResults ' ' CoreNumericsUnitTest / testCoreNumerics '

最后,其中一个标签测试这样的巨大的好处是你不需要承诺只有一个轴分类您的测试内容。这个例子展示了添加特定的标签根据工具箱的特点。然而,我们也可以把测试的类型我们可能想要与另一个轴。例如,如果你是一个喜欢谷歌小/中/大测试命名您可能想要建立一个CI系统运行小测试每签到,中型和大型的测试测试每天晚上,在每个迭代。这延迟测试策略变得非常容易的帮助下测试标签。让我们添加“小”,“媒介”,“大”标签。

classdef(TestTags = {“分类”,“坚持不懈”,“媒介”})ClassificationWithPersistenceTest < matlab.unittest.TestCase%这个测试练习我的两个特性工具箱如何协同工作,即%工具箱分类特性如何持久化处理工作。方法(测试)函数testClassificationResultSavedCorrectly (testCase)%将一些数据并保存结果data =负载(“testData.mat”);分类=(数据)进行分类;classification.persist (“testFile.mat”);结果=负载(“testFile.mat”);testCase。verifyEqual(结果、分类、垫的分类不存在正确文件。”);结束结束结束classdef(TestTags = {“数字”,“小”})CoreNumericsUnitTest < matlab.unittest.TestCase%是一个单元测试的核心数字我的工具箱方法(测试)函数testCoreNumerics (testCase)输入= 1:10;实际= CoreNumericEngine.analyze(输入);预期= expectedResultFromFirstPrinciples(输入);testCase。verifyEqual(实际的预期,“RelTol”、sqrt (eps));结束结束结束classdef(TestTags = {“用户界面”,“大”})AcceptanceSystemTest < matlab.unittest.TestCase%系统测试执行整个堆栈的应用重点%优先客户工作流。方法(测试,TestTags = {“坚持不懈”})函数testApplicationImportData (testCase)无花果= numericsapp;clickImportButtonAndSelect (“testFile.mat”);分类= getClassificationfromUI(图);预期=负载(“testFile.mat”);testCase。verifyEqual(分类、预期,分类数据不正确导入到应用程序。);结束结束方法(测试,TestTags = {“数字”})函数testApplicationNumericResults (testCase)无花果= numericsapp;clickAnalyzeButton(图);实际= getCurrentResult(图);预期= CoreNumericEngine.analyze (getCurrentData(图));testCase。verifyEqual(实际的预期,应用结果不匹配数字对应。);结束结束结束

我们甚至可以预滤器这些测试在测试套件中创建方法像fromFolder:

smallTests = TestSuite.fromFolder (“测试/ v2”,“标签”,“小”);{smallTests.Name}。' mediumTests = TestSuite.fromFolder (“测试/ v2”,“标签”,“媒介”);{mediumTests.Name}。' largeTests = TestSuite.fromFolder (“测试/ v2”,“标签”,“大”);{largeTests.Name}”。
ans = ' CoreNumericsUnitTest / testCoreNumerics ' = ' ClassificationWithPersistenceTest / testClassificationResultSavedCorrectly '岁= ' AcceptanceSystemTest / testApplicationNumericResults ' ' AcceptanceSystemTest / testApplicationImportData '

关键的一点是,尽管这个测试套件非常小,易于管理,这个绝对不持有任何严重的软件开发项目。使用测试标签是一个很好的方式来避免过度依赖有限的文件夹或包结构为测试组织,而不是支持标记每个测试以及它属于哪个轴。

当你正在寻找正确的组测试练习正确的……你的软件产品(等待)....




发表与MATLAB®R2015b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。