1

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

我从谷歌搜索中找到了这个: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();
  }
}
4

3 回答 3

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() 方法时,它应该为剩余的测试保持打开状态。

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

于 2013-07-23T08:28:51.197 回答
1

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

首先我声明窗口使用

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

然后我设置窗口的属性

window.CloseOnPlaybackCleanup = false;
于 2013-07-23T13:05:13.483 回答
1

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

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

于 2013-07-23T09:56:39.137 回答