0

我想在单个测试中启动被测应用程序,并在其他测试中使用打开的应用程序。这是因为启动应用程序需要相当长的时间,如果我为每个测试重复它可能会很昂贵。我想在与 UI 映射对象一起初始化的对象映射中拥有 AUT 的单个对象。

此方法失败,因为即使对象是静态的,也没有在不同测试之间传递对象。这个问题有什么解决办法吗?

用户界面地图

public partial class UIMap
{
    public ApplicationUnderTest _aut { get; set; }

    public void AUT_Open()
    {
        string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
        _aut = ApplicationUnderTest.Launch(AUTExecutable );
    }
    ...
 }

测试

private static UIMap map;

[TestMethod]
public void Test01()
{
    ...
    this.UIMap.RecognitionDesigner_Open();
}

[TestMethod]
public void Test02()
{
    //Do something on the UIMap that tries to use the same member variable- _aut 
    //in the UIMap
}
4

3 回答 3

1

我能够通过使用_aut.CloseOnPlaybackCleanup = false;. 显然,对 UIMap 对象的引用似乎在每个测试方法结束时丢失了。

public partial class UIMap
{
    public ApplicationUnderTest _aut { get; set; }

    public void AUT_Open()
    {
         string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
         _aut = ApplicationUnderTest.Launch(AUTExecutable );
         _aut.CloseOnPlaybackCleanup = false;
    }
    ...
}
于 2013-03-21T08:39:45.027 回答
0

测试彼此独立运行,并且在每个测试中重新创建 UIMap。我建议使用ClassInitialize属性,因为用这个属性标记的方法只在类中的所有测试之前执行一次。您将绝对确定您的流程将被启动,因为现在您依赖于测试的执行顺序,这并不好。

private static TestContext contextSave;

[ClassInitialize]
public static void DoOneTime(TestContext context)
{
    string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
    _aut = ApplicationUnderTest.Launch(AUTExecutable );
    context.Properties.Add("AUT", _aut);
    contextSave = context;
}

[TestMethod]
public void Test01()
{
   //...
   DoSthmWithAUT(context.Properties["AUT"]);
}

[TestMethod]
public void Test02()
{
    DoOtherWithAUT(context.Properties["AUT"]);
}
[ClassCleanup]
public static void Cleanup()
{
     contextSave = null;
}

请注意,通常您无法判断 Test01 在 Test02 之前且仅在 Test02 之前运行。如果您真的想要订购 - 然后使用Ordered Tests.

于 2013-03-19T11:31:50.910 回答
0

我遇到了同样的问题,即在第一种测试方法中初始化的 AUT 对象在第二种方法中为 NULL。我尝试了很多东西,但只有一个对我有帮助:我必须将类的 AUT 属性设为static

这是我使用计算器应用程序的非常简单的代码。

using System;
using Microsoft.VisualStudio.TestTools.UITesting;
using Microsoft.VisualStudio.TestTools.UITesting.WpfControls;
using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UITest.Extension;
using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;

namespace CUIT
{
    [CodedUITest]
    public class UITestDemo
    {
        private readonly string path = @"C:\Windows\SysWOW64\calc.exe";
        static ApplicationUnderTest app = null;

        [TestMethod]
        public void Start()
        {
            app = ApplicationUnderTest.Launch(path);
            Playback.Wait(1000);
            app.CloseOnPlaybackCleanup = false;
            app.SearchProperties[ApplicationUnderTest.PropertyNames.Name] = "Calculator";
            app.SearchProperties[ApplicationUnderTest.PropertyNames.ClassName] = "CalcFrame";
        }

        [TestMethod]
        public void TestButtonOne()
        {
            Assert.IsNotNull(app, "Should not be NULL!");
            app.SetFocus();
            WinButton btn1 = new WinButton(app);
            btn1.SearchProperties[WinButton.PropertyNames.Name] = "1";
            Mouse.Click(btn1);
            Mouse.Click(btn1);
            Mouse.Click(btn1);
            Playback.Wait(3000);
        }
    }
}
于 2016-11-16T12:37:32.037 回答