c# - 使用 NUnit.Forms 进行 GUI 界面测试

标签 c# winforms nunit

我正在尝试编写一些用于测试 GUI 界面的测试。我决定选择 NUnit.Forms。但是测试失败并出现以下错误:

TearDown : System.ComponentModel.Win32Exception : The requested resource is in use

我有两个版本的源代码测试。

首先:

using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using YAMP;

namespace Tests.GUITests
{
    [TestFixture]
    public class GuiTest : NUnitFormTest
    {
        private FrmMain _frm;

        //[SetUp] // or it is still needed
        public override void Setup()
        {
            base.Setup();
            _frm = new FrmMain();
            _frm.Show();
        }

        [Test]
        public void TestData()
        {
            var txtInput = new TextBoxTester("txtInput") {["Text"] = "2+2"};
            var txtOutput = new TextBoxTester("txtOutput");
            Assert.AreEqual("2+2", txtInput.Text);

            var btnRes = new ButtonTester("btnRes");
            btnRes.Click();
            Assert.AreEqual("4", txtOutput.Text);
        }
    }
}

第二个:

using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using YAMP;

namespace Tests.GUITests
{
    [TestFixture]
    public class GuiTest : NUnitFormTest
    {
        private FrmMain _frm;

        //[SetUp] // or it is still needed
        public override void Setup()
        {
            base.Setup();
            _frm = new FrmMain();
            _frm.Show();
        }

        [TearDown]
        public override void TearDown()
        {
            _frm.Close();
            _frm.Dispose();
        }

        [Test]
        public void TestData()
        {
            var txtInput = new TextBoxTester("txtInput") {["Text"] = "2+2"};
            var txtOutput = new TextBoxTester("txtOutput");
            Assert.AreEqual("2+2", txtInput.Text);

            var btnRes = new ButtonTester("btnRes");
            btnRes.Click();
            Assert.AreEqual("4", txtOutput.Text);
        }
    }
}

并且有两个不同版本的方法 TestNoData:

    public void TestFormNoDataHandler()
    {
        var messageBoxTester = new MessageBoxTester("Message");
        messageBoxTester.ClickOk();
    }

    [Test]
    public void TestNoData()
    {
        ExpectModal("Message", TestFormNoDataHandler);
        var txtInput = new TextBoxTester("txtInput") {["Text"] = string.Empty};
        Assert.AreEqual(string.Empty, txtInput.Text);

        var btnRes = new ButtonTester("btnRes");
        btnRes.Click();
        Assert.IsFalse(_frm.DialogResult == DialogResult.OK);
    }

    [Test]
    public void TestNoData()
    {
        var txtInput = new TextBoxTester("txtInput") {["Text"] = string.Empty };
        Assert.AreEqual(string.Empty, txtInput.Text);

        var btnRes = new ButtonTester("btnRes");
        btnRes.Click();
        Assert.IsFalse(_frm.Enable);
    }

可测试的形式非常简单。有两个文本框——“txtInput”、“txtOutput”和按钮——“btnRes”。在“txtInput”中引入了一个数学表达式,并在“txtOutput”中输出响应。当您按下“btnRes”时,表达式的决定就会发生。如果“txtInput”字段为空,则该按钮被禁用,您无法点击它。

在搜索此问题的解决方案时,出现了以下链接:

不幸的是,我只能附上 2 个链接。但是我了解到的信息却大相径庭。尤其是写方法Setup和TearDown的部分。

无论如何,我指定我使用的版本:

  • Visual Studio 2015 社区
  • NUnit - 2.6.4.14350
  • NUnitForms - 1.3.1771.29165

因为在我看来问题可能出在框架的最新版本上,因为我学到的文章很旧。

感谢您的任何建议。

最佳答案

UseHidden 属性:测试在单独的隐藏桌面上运行。这使它们更快,并且适用于任何不使用键盘或鼠标 Controller 的测试。它们的破坏性较小,输入测试不会干扰其他应用程序。

UseHidden 属性控制是否完全使用单独的桌面。

虽然在单独的桌面上进行测试更快更安全(没有键盘或鼠标输入会影响正在运行的应用程序的危险。),但是对于某些操作系统或环境,单独的桌面不起作用。测试会抛出如下错误:

System.ComponentModel.Win32Exception : The requested resource is in use

--TearDown
   at NUnit.Extensions.Forms.Desktop.Destroy()
   at NUnit.Extensions.Forms.Desktop.Dispose()
   at NUnit.Extensions.Forms.NUnitFormTest.Verify()

在这种情况下,您可以覆盖测试类中的 UseHidden 属性并将其设置为返回 false。这将使测试在原始的标准桌面上运行。

关于c# - 使用 NUnit.Forms 进行 GUI 界面测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566278/

相关文章:

c# - 具有不同返回类型的方法重载

c# - 如何在现有的字母数字验证表达式中允许 esc 序列字符

c# - Entity Framework : dynamically change model based on plugins found with MEF

c# - 数据源不反射(reflect) DataGridView 中的排序

asp.net - 如何在测试工具中实例化 asp.net 代码隐藏类?

c# - C# 事件处理程序在内部是如何工作的?

c# - 在鼠标离开事件时关闭 ComboBox DropDown

c# - 为什么 TreeView 控件会折叠所有子节点?

c# - 基于配置文件以编程方式创建新的 NUnit 测试

c# - NUnit 不运行我的新测试