如何在编码的UI测试中使用ClassInitialize?

时间:2013-07-23 04:43:00

标签: visual-studio-2012 coded-ui-tests

我正在玩Coded UI Tests,为calc.exe应用程序编写一些测试。我正在尝试使用ClassInitialize来打开应用程序,这样我的所有测试都可以在应用程序打开的情况下运行,而不是每次都必须打开和关闭应用程序。

我是通过Google搜索找到的:http://www.codesmartnothard.com/CommentView,guid,f28e6205-1ac5-41f3-be0d-f84d7db5c79b.aspx但它没用。如果这实际上是它所需要的全部工作,那将是非常棒的。当我尝试它时会发生ClassInitialize函数运行,应用程序打开,然后在第一次测试尝试运行之前立即关闭,所以当测试运行时,应用程序不再打开,并且在一段时间没有发生任何事情后不可避免地会失败

如何使用ClassInitialize打开应用程序并保持打开以使测试实际运行?

当我有以下代码时,我的测试运行:

[CodedUITest]
public class CodedUITest1
{

  [TestMethod]
  public void CodedUITestMethod1()
  {
    UIMap.OpenCalc(); //Opens calc.exe
    UIMap.Click1(); //Clicks the "1" button
    UIMap.CloseCalc(); //Closes application
  }

  public TestContext TestContext
  {
    get
    {
      return testContextInstance;
    }
    set
    {
      testContextInstance = value;
    }
  }
  private TestContext testContextInstance;

  public static UIMap UIMap
  {
    get
    {
      if ((map == null))
      {
        map = new UIMap();
      }

      return map;
    }
  }

  private static UIMap map;
}

但是,如果我添加此ClassInitialize方法,并在TestMethod中删除对OpenCalc的调用,它将不再起作用。计算器打开,然后因任何原因立即关闭。

[ClassInitialize]
public static void ClassInit(TestContext context)
{
  Playback.Initialize();
  try
  {
    UIMap.OpenCalc();
  }
  finally
  {
    Playback.Cleanup();
  }
}

3 个答案:

答案 0 :(得分:2)

ClassInitilize非常混乱这样,我基本上像构造函数一样使用它来在测试开始时声明一些变量。虽然有很多更好的方法可以做你想做的事。

如果我是你,我会制作多个[TestMethods]并制作一个orderedTest文件,然后指定你想要的顺序(即。首先放置openCalc()方法),如下所示。

[TestMethod]
  public void OpenCalc()
  {
      UIMap.OpenCalc(); //Opens calc.exe
  }


[TestMethod]
  public void CodedUITestMethod1()
  {
      UIMap.Click1(); //Clicks the "1" button
      UIMap.CloseCalc(); //Closes application
  }

现在右键单击您的项目,然后单击新项目orderedTest。然后你可以按照你想要的顺序放置测试方法,当你运行openCalc()方法时,它应该保持打开以进行剩余的测试。

然后基本上在测试资源管理器中,您只需运行有序的测试文件而不是测试方法。

答案 1 :(得分:1)

在运行任何测试之前,

[ClassInitialize]被调用一次。还有一个[AssemblyInitialize]在任何[ClassInitialize]方法(或将要运行)之前调用。 UIMap map字段通常是类实例的成员,而不是类的静态,因此[ClassInitialize]方法无法访问它。您的代码声明UIMap map是静态的,这可能会在许多测试用例中引入问题。

您希望在运行测试之前启动应用程序,以便它可以用于所有测试用例。 .testsettings文件允许指定启动和清理脚本。您可以在这样的脚本中启动应用程序。要创建.testsettings文件,请在解决方案资源管理器中右键单击解决方案,然后选择Add =>新物品。您还必须通过Menu =>选择.testsettings文件。测试

答案 2 :(得分:1)

为防止关闭窗口我这样做, 我使用的是Web应用程序,但我认为这会有所帮助。

首先我使用

声明窗口
window = BrowserWindow.Launch(new Uri("http://www.bing.com"));

然后我设置了窗口的属性

window.CloseOnPlaybackCleanup = false;