[译]NUnitForms官方说明文档
建置
1. 解压文件到任意目录.
2. 从.NET命令行中运行test.bat来建置程序.
编写单元测试
在以NUnit编写的单元测试里, 需要实例化要测试的Form, 并呼叫其Show()方法.
Form form = new Form();
form.Show();
form.Show();
对于你将使用在测试中的每一个控件, 通过其名称创建一个适当的ControlTester实例。
ButtonTester button = new ButtonTester("buttonName");
每一个ControlTester都提供了一些便捷的通过共通的方式访问和控制它的方法. 例如, 在ButtonTester中有一个Click方法, 而在TextBoxTester中有一个Enter(string Text)方法.
如果你打开了多个Form, 你可以特别指定包含你的控件的Form的名称.
ButtonTester button = new ButtonTester("buttonName", "formName");
如果你省略了"formName"参数, NUnitForms将在所有打开的Form中查找控件. 这只在不能唯一识别控件时需要控件名和Form名一并使用(如果有多个实例中都有相同名称的控件时, formName要明确声明).
你可以用ControlTester类来测试任何控件(当然就没有了便捷方法了). 你可以像这样通过属性的索引来访问它的属性.
ControlTester textBox = new ControlTester("nameOfSomeTextBox");
Assertion.AssertEquals("defaultText", textBox["Text"]);
textBox["text"] = "newText";
Assertion.AssertEquals("defaultText", textBox["Text"]);
textBox["text"] = "newText";
你也可以尝试使用FireEvent方法来触发控件的一个事件:
ControlTester button = new ControlTester("nameOfSomeButton");
button.FireEvent("Click");
button.FireEvent("Click");
(注意这里相当于呼叫了一个便捷的方法button.Click();, 但不是每一个控件都有一些便捷的方法可供呼叫. 当然, 最好的办法就是添加新地便捷方法或新的ControlTester, 并将其提交回NUnitForms用于增强其功能.)
控件的命名
NUnitForms通过控件的Name属性来查找你要测试的控件. 如果在一个form中有多个相同名称的控件, 那么他们必须像下面这样进行限定:
Form
PanelA
UserControl1
Button (PanelA.UserControl1.Button)
UserControl2
Button (UserControl2.Button)
PanelB
UserControl1
Button (PanelB.UserControl1.Button)
PanelA
UserControl1
Button (PanelA.UserControl1.Button)
UserControl2
Button (UserControl2.Button)
PanelB
UserControl1
Button (PanelB.UserControl1.Button)
需要注意的是你只需要有确保它有足够的资格来成为一个唯一名称的控件. 如果NUnitForms找不到你的控件, 它会抛出一个NoSuchControlException异常. 如果控件的名称没有资格使它成为一个唯一命名的控件(需要更多的资格), 一个AmbiguousNameException异常将会被抛出.
由于在一个 form中的控件可能被动态地添加或删除, 除非你有实际使用这些控件, 不然这些异常不会被抛出. 合格的控件名称是随时可以改变的. (录制程序应对这些进行处理, 每次都使用尽可能短的控件名称. 这可以帮助录制程序来确字最佳的form名称...)
录制程序的使用
1.启动NUnitFormsRecorderApplication.exe
2.它会提示你浏览并选择一个包含你要测试的form的dll文件.
3.当程序打开时有一个包含已加载的.dll文件中的所有Form类的下拉列表. 从下拉列表中选择一项让录制程序显示你的form并开始一个空的单元测试.
4.当你在form上进行操作时, 测试将记录你的行为(至少他会记录NUnitForms及录制程序支持的行为).
5.在控件上点右键, 你可以插入一个关于该控件上任何属性的断言. 录制程序的行为可以被扩展到你自己写的录制类中. 你可以以提供的录制程序类的原文件为例子, 或者后面的"如何添加控件录制"章节.
6.一旦你的测试写元, 拷贝并粘贴到你的单元测试类里, 当然, 你可以在那里进行手动的修改.
如何添加新的ControlTester
ControlTester应该:
1.继承ControlTester类, 像这样:
public class ComboBoxTester : ControlTester
2.实现三个构造函数, 像这样:
public ComboBoxTester(string name, Form form) : base(name, form){}
public ComboBoxTester(string name, string formName) : base(name, formName){}
public ComboBoxTester(string name) : base(name){}
public ComboBoxTester(string name, string formName) : base(name, formName){}
public ComboBoxTester(string name) : base(name){}
< p>3.为了支持录制程序, 要实现一个只读的"Properties"属性, 返回的是一个包含所有属性对象(即在你在录制时需要断言一个录制功能时右键点击的对象). 最简单的要展现所有属性的方法就是将把回的"Control"转换为适当的类型.(Control是一个所有控件都要继承的基类.)
public ComboBox Properties {
get {
return (ComboBox) Control;
}
}
get {
return (ComboBox) Control;
}
}
4.实现直接的属性和方法来提供常用的属性和互动:
public void Select(int i) {
Properties.SelectedIndex = i;
}
public string Text {
get {
return Properties.Text;
}
}
Properties.SelectedIndex = i;
}
public string Text {
get {
return Properties.Text;
}
}
5. 任何NunitForms分发的ControlTester都应有针对它们提供的功能的单元测试. 在NUnitFormsTestApplications目录里有一些小而简单的针对典型控件的单元测试. 在每次发行时, 我都希望每个Tester都有相关的Recorders.
如何添加控件的Recorder
控件的Recorder应该:
1. 继承ControlRecorder类, 像这样:
public class ComboBoxRecorder : ControlRecorder
2.像这样复写RecorderType属性. 它应该返回录制程序录制的控件的类型.
public override Type RecorderType {
get {
return typeof(ComboBox);
}
}
get {
return typeof(ComboBox);
}
}
3.像这样复写TesterType属性. 它应该返回相应的ControlTester.
public override Type TesterType {
get {
return typeof(ComboBoxTester);
}
}
get {
return typeof(ComboBoxTester);
}
}
4.像这样实现一个构造函数:
public ComboBoxRecorder(Listener listener) : base(listener){}
5. 为每个你要录制的事件创建一个带签名的与你要录制的事件的委托类型相吻合的方法. 方法的名称应与事件的名称相吻合. 实现方法时应呼叫listener.FireEvent(). 要重载listener.FireEvent()的哪个版本取决于你要录制什么. 这里需要注意的是录制的事件要与ControlTester的便捷方法相对应. 下面是一些例子:
//records button.Click()
public void Click(object sender, EventArgs args) {
listener.FireEvent(TesterType, sender, "Click");
}
//records: comboBox.Enter("text");
public void TextChanged(object sender, System.EventArgs e) {
listener.FireEvent(TesterType, sender, "Enter",
((ComboBox)sender).Text);
}
//records: comboBox.Select(3); //text of item 3
public void SelectedIndexChanged(object sender,System.EventArgs e){
EventAction action = new EventAction("Select",
((ComboBox)sender).SelectedIndex);
action.Comment = ((ComboBox)sender).Text;
listener.FireEvent(TesterType, sender, action);
}
public void Click(object sender, EventArgs args) {
listener.FireEvent(TesterType, sender, "Click");
}
//records: comboBox.Enter("text");
public void TextChanged(object sender, System.EventArgs e) {
listener.FireEvent(TesterType, sender, "Enter",
((ComboBox)sender).Text);
}
//records: comboBox.Select(3); //text of item 3
public void SelectedIndexChanged(object sender,System.EventArgs e){
EventAction action = new EventAction("Select",
((ComboBox)sender).SelectedIndex);
action.Comment = ((ComboBox)sender).Text;
listener.FireEvent(TesterType, sender, action);
}
6.在某些(希望极少数)情况下, 你可能不得不复写基类Recorder的EventKey方法. 我想在这个框架的基类Rcorder中我已经处理了常见的案例并作了必要的扩展.
-----------------------全文完-------------------------
第一次翻译文章, 肯定有很多地方译的不好, 希望大家指正. ^_^
原文地址: http://nunitforms.sourceforge.net/docs.html
转载请注明来源(http://leonny.cnblogs.com/).