AX 单元测试框架

原文:http://msdn.microsoft.com/en-us/library/aa874515.aspx

单元测试框架

AXMorphX IDE非常紧密地集成了单元测试框架。对于测试驱动开发(TDD)而言,这一集成是非常重要的,因为对于所要测试的每一个特性都可以创建对应的测试单元。更多TDD的信息可以查看微软的测试驱动开发向导。(我个人更建议你看看浅谈测试驱动开发

什么是单元测试


一个单元测试就是一段代码,它用于测试实现某一特征(可理解为功能)的代码(下文中统一称作:特征代码)是否被正确实现。如果你遵循TDD原则的话,最佳实践是开发人员首先写单元测试,然后再写特征代码。这样可以将开发的重点放在特征代码的调用及创建更为友好的API上。在单元测试框架中,一个单元测试,包括测试用例、如何使用数据执行测试用例以及组织测试用例。一个测试用例既一个继承自SysTestCase的子类。你可以为每一段特征代码添加测试方法,可以在代码发送修改的使用执行测试用例。

命名规则

被测试的类的名字加test既是对应测试用例的名字,按照这样的规则,AX会自动关联类及测试用例,并且在执行测试用例时单元测试框架会统计测试的代码覆盖率。如果这样的命名规则不能满足你的需要,你可以选择下面的备选方法:

命名规则

描述

重写testsElementName方法

关联被测试的类。

如果你不想使用测试用例默认的命名规则(既类名+test),你可以选择重写该方法来实现测试用例与被测试类之间的关联。

重写testsElementType方法

关联正确的被测试对象类型

如果你要测试非class类型的对象,就需要重写该方法。比如,如希望测试一个表。

如果统计代码覆盖率功能被激活,并且测试用例中被测试对象的类型和名字被正确赋值,代码覆盖率才能够正常工作。

例子

这个例子演示如何声明一个测试类。被测试的类名字为Employee

测试用例创建向导

下面的列表列举了创建测试用例的指导方针:

  • 你以被测试类名+test来命名你的测试用例.
  • 以有意义的方式来分组测试用例。不要创建很多功能相似的用例,将用例分组可以帮助识别冗余。
  • 不要为每一个方法和属性都创建测试用例。这样会导致很多不必要的简单测试用例,会加重你的工作负担。
  • 重构你的测试用例以使他简单。如果测试代码被多个测试方法共享,可以创建一个新的私有方法来包含这段代码。
  • 避免依赖和过度复杂,最后避免不同单元测试间共享测试代码。

可用的测试方法

单元测试框架提供了很多方法(断言方法,既判断是与不是的方法)来满足你的测试需要。创建测试用例时首先创建一个继承自SysTestCase的子类。

下面的列表列举了使用断言时的一些指导方针:

  • 对已测试的条件不需要断言
  • 在希望得到特定预期值的时候使用断言
  • 在比较字符串时使用label而不是静态字符串

下表描述了SysTestCase类所包含的断言方法,更多的信息请点击每一个方法上的链接。

方法

描述

assertEquals

测试两个值是否相等

assertFalse

测试值是否为false

assertNotEqual

测试两个值不相等

assertNotNull

测试值不为null

assertNotSame

测试对象引用不相同

assertNull

测试值为null

assertRealEquals

测试实数与特定值的差异是否在一定范围之内

assertSame

测试对象引用相同

assertTrue

测试值为true

fail

允许你创建自己的判断逻辑,并调用fail方法与单元测试框架集成

parmExceptionExpected

测试一个预期的异常

以下部分介绍单元测试框架的内容。

单元测试工具栏


单元测试工具栏可以用于选择一个测试用例,运行该测试用例,查看结果及运行细节。通过该路径访问单元测试工具栏:AX工具栏/Tools/Development tools/Unit test/Show toolbar。你也可以通过另外的方法访问单元测试工具栏:在测试用例上右键单击/Add-ins/Run tests

单元测试详细内容


单元测试详细内容提供如下信息:测试是否通过,什么时候,谁创建了该测试用例,代码覆盖率已经环境变量。你可以通过点击单元测试工具栏的Details按钮来访问这些细节。

代码覆盖率

在测试执行过程中,运行的每一行都会被记录。你可以查看被测试代码如何被测试及那些没有被覆盖的代码,从而改进测试用例。

你必须激活捕捉测试覆盖率的功能选项。测试用例执行以后代码覆盖率是通过Form来显示的。关于如何激活捕捉代码覆盖率选项及如何查看代码覆盖率请查看:如何访问代码覆盖率详细信息

测试结果输出

单元测试框架提供了多种报表选项,称之为监听器。默认情况下,但你通过单元测试工具栏运行测试用例时,数据库被作为监听器。你也可以添加其他的监听器。更多关于如何选择其他的监听器请查看如何显示测试用例结果。下表列举了单元测试框架支持的监听器:

  • 数据库
  • Infolog
  • Infolog (result only)
  • Print窗口
  • 进度条
  • Text 文件XML 文件

组织测试用例


但测试用例的数量不断增加时,如何组织测试用例变得非常重要。测试用例可以分组为测试套件(test suites)。一个测试套件可包含一个或多个测试用例以及测试套件。这样,测试用例就可以被按层次结构分组。更多关于如何创建测试套件及测试项目的信息,请查看如何组织测试用例

装载和拆卸共享数据

你可以在两个级别上装载和拆卸共享数据,测试用例级别和测试套件级别。装载和拆卸共享数据带来的好处远不止允许你以更有意义的方式组织测试用例。如果你的测试使用相同的装载和拆卸代码,可以将这些代码写在测试用例的setUptearDown方法中。测试框架会确保每个测试方法执行时,都会调用装载和拆卸方法。

另一种情况是装载和拆卸代码只在整个测试类执行的开始和结束执行,既先执行装载,然后运行所有测试方法,最后拆卸。这种情况下你可以将装载和拆卸代码写在测试套件的tearDown方法中。

更多信息请参考如何为测试用例创建装载和拆卸逻辑

隔离测试用例

根据测试用例对数据修改的不同,需要隔离测试用例的级别也不同。单元测试框架提供了4种测试套件,分别提供不同界别的隔离。下表描述了测试套件及其隔离级别。

测试套件

隔离级别描述SysTestSuite

没有任何隔离。默认的测试套件。SysTestSuiteCompanyIsolateClass

为测试用例构造一个空的公司账号,所以测试方法都在该公司下运行,最后在删除该账号。

SysTestSuiteCompanyIsolateMethod

为每一个测试方法创建一个空的公司账号,在该方法执行完后删除该账号。这一级别提供了最好的隔离,但是这是以一定的性能损耗为前提的。

SysTestSuiteTTS

每一个测试方法都被以一个交易来进行封装。在测试方法执行完后,交易被终止而不会被提交。

这一级别表现很好但有两点限制:

1. 不能用于需要提交数据的测试

2. 不支持parmExceptionExpected

例子

下面的代码演示了如何使用隔离。你需要在你的测试用例中重写createSuite方法来返回合适的测试套件。

更多关于创建、运行和评估测试用例的信息,请查看演示:使用单元测试框架测试类

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结