.NET UI测试(单元和集成)
我的任务是提出一个解决方案,在UI级别有效地进行单元测试和集成测试。不幸的是,windows窗体中有很多代码。我们还有一个棕地项目,我们正在慢慢地转移到WPF(WPF中有新功能,当需要进行重大更改时,将旧功能转移到WPF) WPF中的所有内容都经过单元测试(数据库除外)。我使用的是MVVM方法,所以几乎所有的代码都在那里 然而,部署前的测试需要很多时间,我们需要一种方法来自动化大部分测试 也就是说,我所指的测试需要在UI上进行 windows窗体部件必须进行集成测试,因为部分逻辑在代码隐藏中完成,部分在数据库中完成 WPF窗口应该可以在UI级别进行单元测试,但也可以进行集成测试 我知道这对于一个问题来说是很难接受的,但是有人有什么建议吗?(这个答案是关于如何集成测试您的代码:WinForms和WPF。) 我没有为您提供专利解决方案,只是建议您投入大量时间和精力使测试易于维护 确保您可以在Visual Studio中修改和运行测试。 必须为测试启动一个不同的工具的额外负担可能足以让开发人员不去做(我见过这种情况发生)。所以,试着找到一个允许这样做的方法 不要记录测试。 虽然很舒服,但是记录测试的结果代码很难阅读和理解,并且很可能包含很多无关紧要的细节。如果您需要对测试进行更改,您可能需要重新记录它们。这些测试更多的是系统如何工作的文档,而不是您希望它如何工作的规范 为您的测试创建共享基础架构。 在表示窗口行为的对象中为窗口/窗体创建抽象。通过这种方式,您可以在这些对象中隐藏实现细节,从而使实际测试紧凑且易于阅读。一旦有了这个基础设施,就可以很容易地添加新的测试。此外,如果实现细节发生更改,您只有一个地方可以对测试进行更改:在基础架构中 在web测试世界中,这被称为 C#中的测试示例: (这个答案是关于如何集成测试代码:WinForms和WPF。) 我没有为您提供专利解决方案,只是建议您投入大量时间和精力使测试易于维护 确保您可以在Visual Studio中修改和运行测试。 必须为测试启动一个不同的工具的额外负担可能足以让开发人员不去做(我见过这种情况发生)。所以,试着找到一个允许这样做的方法 不要记录测试。 虽然很舒服,但是记录测试的结果代码很难阅读和理解,并且很可能包含很多无关紧要的细节。如果您需要对测试进行更改,您可能需要重新记录它们。这些测试更多的是系统如何工作的文档,而不是您希望它如何工作的规范 为您的测试创建共享基础架构。 在表示窗口行为的对象中为窗口/窗体创建抽象。通过这种方式,您可以在这些对象中隐藏实现细节,从而使实际测试紧凑且易于阅读。一旦有了这个基础设施,就可以很容易地添加新的测试。此外,如果实现细节发生更改,您只有一个地方可以对测试进行更改:在基础架构中 在web测试世界中,这被称为 C#中的测试示例:.NET UI测试(单元和集成),.net,unit-testing,user-interface,integration-testing,.net,Unit Testing,User Interface,Integration Testing,我的任务是提出一个解决方案,在UI级别有效地进行单元测试和集成测试。不幸的是,windows窗体中有很多代码。我们还有一个棕地项目,我们正在慢慢地转移到WPF(WPF中有新功能,当需要进行重大更改时,将旧功能转移到WPF) WPF中的所有内容都经过单元测试(数据库除外)。我使用的是MVVM方法,所以几乎所有的代码都在那里 然而,部署前的测试需要很多时间,我们需要一种方法来自动化大部分测试 也就是说,我所指的测试需要在UI上进行 windows窗体部件必须进行集成测试,因为部分逻辑在代码隐藏中完成
我完全同意Torbjorn的回答,但想补充几点: 从小处做起 页面对象模式是简化测试的一个很好的方法,但是您会发现,正确地提取抽象需要很长时间。从抽象出你需要的东西开始,随着时间的推移慢慢地添加进去 增值 不要过火,试着编写端到端的回归测试。相反,专注于编写增加价值的测试。例如,证明应用程序启动时没有错误的单个测试非常有用,可以提供构建过程的早期反馈。从那里干出来 平衡“深”与“浅” 测试用户界面有几种不同的方法。在他们之间建立一种混合 显而易见的方法是使用类似于产品的设置测试应用程序,以证明应用程序“从前端到端”工作。这些是“深入”的集成测试,用于测试代码的所有部分,非常有用。它们的速度也可能非常慢,因为它们通常依赖于外部服务等。通常,为了可靠,应用程序必须在测试运行之间重新启动,以确保有效的环境 该方法的一个轻微修改是使用存根服务(伪造的产品目录、伪造的身份验证提供者等)测试应用程序。这些是“肤浅”的测试,证明用户界面在集成在一起时可以工作。它们通常运行得更快一点,因为它们不会有相同的物理约束,如要考虑的网络延迟。您可以更多地关注演示细节和其他边缘情况 进一步的修改是隔离用户界面的各个部分,并在测试线束中运行它们。这些测试将比以前的方法运行得更快,因为它们不会有启动整个应用程序的相同开销。使用这些测试来确定颜色和高度专业化的表示关注点 稳定时迭代
ApplicationFake application = new ApplicationFake();
// ApplicationFake.Start() starts the application resulting in that main form opens.
// Start() returns an object that represents the actions that the user can perform on
// the main form.
// The Start() method might contain an assert that the main form was actually opened.
MainFormFake mainForm = application.Start();
// Performing an action that opens a new form returns a representation of the new form,
// in this case the object SomeFormFake.
SomeFormFake someForm = mainForm.ClickOpenSomeFormButton();
// The form fakes exposes properties that returns the forms' observable state.
Assert.That(someForm.Title, Is.EqualTo("Some Form's Title"));