CodedUI测试项目结构

时间:2014-01-08 17:14:50

标签: coded-ui-tests test-framework

您能否分享一下CodedUI测试项目的结构?

看看你如何分开测试,助手,UIMaps会很有趣。

3 个答案:

答案 0 :(得分:1)

这就是我这样做的方式。绝不是最佳或唯一的方式。

我有一个基本功能的静态实用程序类,并启动/关闭appundertest

public static class Utilities
{
    private static ApplicationUnderTest App;
    public static Launch()
    {
         try
         {
              App = ApplicationUnderTest.Launch(pathToExe);
         }
         catch (Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToLaunchApplicationException e) {} 
    }
    public static Close()
    {
        App.Close();
        App = null;
    }
}

我的所有* .uimaps都是基于应用程序的“页面”或“屏幕”分开的。这有时会被编码,并且你的* .uimaps会破坏。另外值得一提的是,所有的uimaps都包含页面上的单个操作,例如填写登录用户名或点击按钮。

然后我有一个NavMap类,它包含我将在我的应用程序中执行的所有更高级别的“导航”。提出一些错综复杂的结构可能会更好,但我更喜欢在静态类中列出列表方法

//you will need to include the uimap in a using statement
public static class NavMap
{
 public static void Login()
 {
  this.credsUIMap.EnterUsername();
  this.credsUIMap.ENterPassword();
  this.credsUIMap.ClickLoginButton();
 }

 public static void LogOut()
 {
  this.credsUIMap.ClickLogOutButton();
 }
}

最后,我有编码形成的codedUI测试文件

[TestClass]
public class Tests
{
    [TestMethod]
    public void TestMethod1()
    {
        NavMap.Login();
    }
    [TestMethod]
    public void TestMethod2()
    {
        NavMap.LogOut
    }

    [ClassInitialize()]
    public static void ClassInitialize(TestContext testcontext)
    {        
        Utilities.Launch();
    }

    [ClassCleanup()]
    public static void ClassCleanup()
    {        
        Utilities.Close();
    }
}

我也为不同类型的测试(正面,负面,压力......)分别做测试文件然后我将它们组合在一个有序的测试中

答案 1 :(得分:0)

我使用多个项目。一个常规包含其他项目的常用方法和常用UIMap(与常规项目的相应依赖关系)。

然后我为每个要自动化的桌面或Web应用程序创建了一个项目。 在项目中: 每个窗口的UIMap。 然后,每个测试实例都会使用每个测试实例。 每个测试的最佳结果。


我可以添加下一个例子:

***我无法发布图片 我当前测试解决方案结构的示例:http://i.stack.imgur.com/ekniz.png

从方法测试中调用记录操作的方法是:

#using Application.UIMaps.Common_Application_UIClasses;
#using Application.UIMaps.Window_1_UIClases;

...

Common_Application_UI app_common = new Common_Application_UI();
Window_1_UI win1 = new Window_1_UI();

app_common.goToMenuThatOpenWindow1();

win1.setSomething("hello world!");
win1.exit();
app_common.exit();

也许这不是最好的工作方式,但目前这就是我的工作方式。

为我的英语道歉。我希望它激励你。

答案 2 :(得分:0)

我强烈建议使用Code FirstCodedUI Page Modeling(我写的)以高度可测试的方式在UI上创建抽象。

即使没有这些框架,您也可以轻松地在测试中编写抽象,以便您的测试解决方案看起来与您的主要解决方案代码非常相似。

我写了blog post关于它的外观。

通常,我会为应用程序中的每个主要工作流创建一个文件夹,为共享创建一个文件夹。这与您的应用程序的MVC结构非常相似。您的应用中的每个控件都将成为测试项目中的页面模型。

Web Project
 |
 |
 Views
   |
   --- Accounts
   |   |
   |   --- Create
   |   --- Manage
   |
   |
   --- Products
         |
         --- Search


Test Project
    |
    |
    --- Page Models
           |
           --- Accounts
                 |
                 --- ICreateAccountPageModel (interface)
                 ---  CreateAccountPageModel (coded ui implementation)
                 --- IManageAccountPageModel
                 ---  ManageAccountPageModel
           --- Products
                 |
                 --- ISearch
                 ---  Search

    |
    --- Tests
          |
          --- Accounts
                 |
                 --- CreateAccountTests
                 --- ManageAccountTests
          --- Products
                 |
                 --- SearchProductTests

Page Models表示正在测试的页面(如果进行更现代的Web开发,则表示测试中的控件)。这些可以使用测试驱动方法编写,而实际上还没有开发UI。

创建帐户视图将包含用户名,密码和确认密码输入。

创建帐户页面模型将具有设置输入,验证页面状态,单击注册按钮等的方法。

测试将再次测试页面模型的界面。该实现将使用Coded UI编写。

如果您在网站中使用MVVM模式,您的页面模型最终会看起来非常像您的视图模型。