AX 演示:使用单元测试框架测试类
时间:2020-01-06 分类:设计模式 作者:编程之家用户
原文: http://msdn.microsoft.com/en-us/library/bb410465.aspx
演示:使用单元测试框架测试类
AX 集成了一个单元测试框架,该框架用于创建、运行及分析单元测试。在这个演示中,你将创建一个满足特定要求的 Employee 类,创建一个测试用例来测试类是否满足了这些要求。单元测试框架基于 TDD (测试驱动开发)。关于 TDD 的更多信息,请查看 测试驱动开发向导 。 TDD 建议首先创建测试用例(这个时候由于没有写被测试的类的代码,所以测试用例运行会失败),然后创建类并书写代码以满足类的要求,并可以通过测试。下面的步骤提及了 TDD 过程,但目的是强调单元测试框架。在你创建和运行测试用例后,你可以查看代码覆盖率,为测试用例设置隔离等级。
类 Employee 需要符合以下要求:
但一个 Employee 类的实例被创建时,类的名字使用方法 name 来设置。
Employee 类有一个 retire 方法,在职员退休时调用 retire 。对于同一职员该方法只能被调用一次。
这一演示将阐述以下任务:
创建一个 Employee 类根(指只包含类声明没有任何方法和实现的类)
创建一个测试类
为测试用例设置数据
为 name 方法这一要求创建一个测试用例
运行测试用例 retire 方法这一要求创建一个测试用例
步骤代码覆盖率
设置隔离等级
先决条件
完成这一演示,你需要:
Microsoft Dynamics AX
拥有包含开发权限的 License
创建 Employee 类根
遵循 TDD 的原则,在写任何类的实现以前首先创建测试用例。为了减少编译错误,你需要先创建一个类根 (class stub) ,只有一个类什么,没有任何实现。
创建 Employee 类
1. 打开 Microsoft Dynamics AX 。
2. 按 CTRL+D 打开应用程序对象树( AOT )。 3. 在 AOT 上,右键单击 Classes 节点,然后点击‘ New class’ 。
注释
Classes 节点扩展出一个新的命名为 Class1 的类。
4. 右键单击 Class1 ,点击 Rename 然后重新命名为 Employee 。
创建测试类
创建测试用例的时候,你需要创建一个类,其命名必须符合最佳实践以关联到被测试的类。测试类的名字为被测试类的名字加 Test 。在这一步骤里,你将创建一个继承自 SysTestCase 的子类 EmployeeTest 。
创建测试类
1. 右键单击 Classes 节点,然后点击 New class 。
2. 双击 Class1 打开代码编辑器。 3. 在代码编辑器中,通过修改声明继承 SysTestCase 。并声明一个 Employee 类的实例。
class EmployeeTest extends SysTestCase
{
// Create a member variable named employee.
Employee employee;
}
为测试用例设置数据
在这一步骤中,你将创建一个 Employee 类的实例,它将被用在所以测试用例中。
为测试用例设置数据
1. 在 AOT 中,右键单击 EmployeeTest ,选择 Override method ,然后点击 Setup 。
2. 在代码编辑器中,按如下代码修改 setUp 方法。
public void setUp()
{
;
// Create an employee instance to use in test cases.
employee = new Employee("your name");
super();
}
为 Name 方法这一要求添加测试用例
在这一步骤中,你将添加一个测试用例。你将为类 EmployeeTest 添加一个新的方法,严重 epmployee 的 name 被正确设置。
为 name 要求添加测试用例
EmployeeTest 类,选择 New method 。
2. 在代码编辑器中,按如下代码修改该方法。
void testName()
{
// Verify that the employee name is set correctly.
this.assertEquals("your name",employee.name());
}
现在如果运行这个测试用例会是失败的,你可以为这一测试用例书写特征代码以完成编译并可以使测试用例运行成功。并重写 Employee 类的 new 方法以接受一个字符串作为参数。
添加特征代码
AOT 上,在 classDeclaration 方法节点上右键双击。
2. 在代码编辑器中,按如下代码修改声明。
class Employee
{
// Create member variables.
str name;
}
Employee 类节点,选择 new 。 4. 在代码编辑器中,按如下代码修改 new 方法。
void new(str _name)
{
;
name = _name;
}
5. 在 Employee 类,点击 6. 在代码编辑器中,按如下代码修改该方法。
public str name()
{
;
// Return the expected string.
return name;
}
7. 在 Employee 类并点击 Compile 。 8. 右键单击 Compile 。
运行测试用例
在这一步骤中,你将通过单元测试工具栏来运行测试用例。运行测试用例的更多信息请查看: 如何运行测试用例 。
运行测试用例
在 AOT 上,右键单击 EmployeeTest 类,选择 Add-Ins ,然后点击 Run tests 。
注释
将会打开单元测试工具栏并且运行测试。由于只添加了一个测试用例,所以运行结果是‘ 1 run,0 failed ’。
在这一步骤中,你将修改测试用例以使测试失败。在 TDD 中,首先都是创建一个运行失败的测试用例。由于编译的原因,在这个例子中,首先便创建了运行会成功的测试用例。
使测试用例失败
AOT 上,双击 Employee 类的 name 方法节点。 In the AOT,in the Employee class node,double-click the name method .
public str name()
{
;
// Return the expected string.
// return name;
// Return an empty string to make the test case fail.
return "";
}
4. 在单元测试工具栏上,点击 Run 按钮。
运行结果显示‘ ’。 Infolog 显示预期的结果和实际的结果。
Error:
[EmployeeTest.testName]Failure: Assertion failed! (Expected: your name; Actual: )
Infolog 中,可以点击 Edit 按钮打开代码编辑器并定位到断言失败的地方。 6. 在 name 方法。 7. 在代码编辑器中,按如下代码修改该方法。
public str name()
{
// Return the expected string.
return name;
// Return an empty string to make the test case fail.
// return "";
}
8. 在 Employee 类,并点击
为 Retire 需求添加测试用例
在这一步骤中,你将为退休这一需求创建测试用例。你将给 EmployeeTest 添加一个新的方法来完成这一测试用例。这样测试用例用于验证对应同一职员,如果 retire 方法被调用超过一次,将会抛出异常。同样,遵循 TDD 的原则,你将在写任何被测试类的实现前首先创建测试用例,所以不要编译。
为退休这一需求添加测试用例
EmployeeTest 然后点击
void testRetire()
{
;
// Call the retire method,first time should be successful.
employee.retire();
// Expect an exception to be thrown because the employee is
// already retired.
this.parmExceptionExpected(true,"Already retired");
employee.retire();
}
在你为 Employee 类添加 retire 方法前,不要编译测试用例。你必须为 Employee 类添加一个变量才存储职员是否已退休。为了简化这个例子,你将抛出一个静态字符串的错误信息,在实际使用时,你应该创建一个 label 而不是使用静态文本‘ Already retired ’。
添加 retire 方法
classDeclaration 方法上双击。
2. 在代码编辑器中,为 ClassDeclaration 方法添加如下成员变量。
boolean retired;
4. 在代码编辑器中,按如下代码修改该方法。
public void retire()
{
// If retired,throw an exception,otherwise set the retired value to true.
if (retired)
throw error("Already retired");
retired = true;
}
Employee 类点击 6. 右键单击 EmployeeTest 类,点击 7. 在单元测试工具栏上,点击
由于添加了两个测试用例,所以运行结果显示‘ 2 run,0 failed ’。你可以通过不第二次调用 testRetire 方法来是第二个测试用例运行失败。按如下代码修改:
void testRetire()
{
;
// Call the retire method,first time should be successful.
employee.retire();
// Expect an exception to thrown because the employee is already retired.
this.parmExceptionExpected(true,"Already retired");
// employee.retire();
}
捕捉代码覆盖率