使用多个 UI 映射测试大型应用程序
本主题讨论在使用多个 UI 映射来测试大型应用程序时如何使用编码的 UI 测试。
在创建新的编码 UI 测试时,默认情况下,Visual Studio 测试框架会在 UIMap 类中生成测试代码。 有关如何录制编码的 UI 测试的更多信息,请参见如何:创建编码的 UI 测试和编码的 UI 测试剖析。
为 UI 映射生成的代码针对与测试交互的每个对象都包含一个类。 对于每个生成的方法,都会专门为该方法生成方法参数的伴生类。 如果应用程序中存在大量对象、页以及窗体和控件,UI 映射可能会变得很大。 而且,如果多个人正在执行测试,则只有一个大型 UI 映射文件的应用程序会变得难以操作。
使用多个 UI 映射文件具有以下优点:
每个映射可与应用程序的一个逻辑子集关联。 这样就更便于管理变更。
每个测试人员都可以处理应用程序的一个部分并签入其代码,而不会干扰正在处理应用程序的其他部分的其他测试人员。
可以增量方式调整对应用程序 UI 的内容添加,从而最大程度地减少对 UI 其他部分测试的影响。
您是否需要多个 UI 映射?
可在以下情况下创建多个 UI 映射:
一起执行逻辑操作的多个复杂的复合 UI 控件集,如网站中的注册页或购物车的购买页。
可从应用程序的各个点进行访问的独立的一组控件,如具有多个操作页的向导。 如果向导的每页都特别复杂,则可为每页创建单独的 UI 映射。
添加多个 UI 映射
向项目添加 UI 映射
若要在测试项目中创建文件夹以存储所有 UI 映射,请在**“解决方案资源管理器”中右击测试项目文件,指向“添加”,再单击“新建文件夹”**。 例如,可将其命名为 UIMaps。
新文件夹显示在测试项目下面。
右击 UIMaps 文件夹,指向**“添加”,然后单击“新建项”**。
显示**“添加新项”**对话框。
提示
若要添加新的编码 UI 测试映射,您必须在测试项目中。
从列表中选择**“编码的 UI 测试映射”**。
在**“名称”**框中,输入新 UI 映射的名称。 使用该映射将表示的组件或页的名称,例如,HomePageMap。
单击**“添加”**。
Visual Studio 窗口将最小化,同时显示**“编码的 UI 测试生成器”**对话框。
为第一个方法录制操作,然后单击**“生成代码”**。
在为第一个组件或页录制所有操作和断言并将它们分组为方法后,关闭**“编码的 UI 测试生成器”**对话框。
继续创建 UI 映射。 为每个组件录制操作和断言并将它们分组为方法,然后生成代码。
在许多情况下,应用程序的顶级窗口对所有向导、窗体和页保持不变。 尽管每个 UI 映射都有一个用于顶级窗口的类,但所有映射可能都引用同一个顶级窗口,应用程序的所有组件都在该窗口中运行。 编码的 UI 测试会按层次结构从顶级窗口开始从上至下搜索控件,所以在复杂应用程序中,每个 UI 映射中的实际顶级窗口可能是重复的。 如果实际顶级窗口是重复的,则在该窗口发生改变时,将会进行多个修改。 当您在 UI 映射之间进行切换时,这可能会引起性能问题。
为了尽量减小这种影响,可以使用 CopyFrom() 方法来确保该 UI 映射中的新顶级窗口与主顶级窗口相同。
示例
以下示例是某个实用工具类的一部分,该类可提供对每个组件及其子控件的访问权限,而这些子控件由在各种 UI 映射中生成的类表示。
对于本示例,名为 Contoso 的 Web 应用程序具有一个主页、一个产品页和一个购物车页。 上述每个页共享一个公共的顶级窗口,即浏览器窗口。 每页都有一个 UI 映射,实用工具类具有类似于下面的代码:
using ContosoProject.UIMaps;
using ContosoProject.UIMaps.HomePageClasses;
using ContosoProject.UIMaps.ProductPageClasses;
using ContosoProject.UIMaps.ShoppingCartClasses;
namespace ContosoProject
{
public class TestRunUtility
{
// Private fields for the properties
private HomePage homePage = null;
private ProductPage productPage = null;
private ShoppingCart shoppingCart = null;
public TestRunUtility()
{
homePage = new HomePage();
}
// Properties that get each UI Map
public HomePage HomePage
{
get { return homePage; }
set { homePage = value; }
}
// Gets the ProductPage from the ProductPageMap.
public ProductPage ProductPageObject
{
get
{
if (productPage == null)
{
// Instantiate a new page from the UI Map classes
productPage = new ProductPage();
// Since the Product Page and Home Page both use
// the same browser page as the top level window,
// get the top level window properties from the
// Home Page.
productPage.UIContosoFinalizeWindow.CopyFrom(
HomePage.UIContosoWindowsIWindow);
}
return productPage;
}
}
// Continue to create properties for each page, getting the
// page object from the corresponding UI Map and copying the
// top level window properties from the Home Page.
}