【问题标题】:How do I programatically determine how many unit tests have been executed?如何以编程方式确定已执行了多少单元测试?
【发布时间】:2014-04-11 15:02:53
【问题描述】:

我有一个 CodedUI 测试套件,它作为 MSTest 单元测试运行。我在 AssemblyCleanup 中有一个方法,它将通过电子邮件发送存储在外部数据库中的测试运行结果。如何以编程方式确定在上次运行会话期间执行了多少单元测试?如果我们执行的测试少于 10 个,我不想发送电子邮件。这样,我们只有在运行整个 CodedUI 套件时才会收到电子邮件,而不是在调试测试时收到电子邮件。我们目前有一个必须手动设置的 SendEmail 标志,但我希望以编程方式确定。

【问题讨论】:

  • 这对我来说听起来像是一个主要的黑客/反模式。我不想在单元测试集中添加这种工具。
  • +1。如果破坏性测试使测试运行结束,则不会发送结果。更好的想法可能是使用 vstest.console.exe /logger:trx 并解析 trx 文件以获取测试结果。如果您决定走这条路,请参阅stackoverflow.com/questions/14483837/…

标签: c# unit-testing mstest coded-ui-tests vs-unit-testing-framework


【解决方案1】:

使用一个基础测试类,它有一个属性来保存已执行测试的数量。所有其他测试类都继承它并在TestInitialize 上增加该属性。

运行以下代码并在测试输出中查看结果。

[TestClass]
public class BaseTestClass
{
    private static int _executedTests;
    private static int _passedTests;

    [AssemblyCleanup()]
    public static void AssemblyCleanup()
    {
        Console.WriteLine("Total tests executed: {0}", _executedTests );
        Console.WriteLine("Total passed tests: {0}", _passedTests);
    }

    protected void IncrementTests()
    {
        _executedTests++;
    }

    protected void IncrementPassedTests()
    {
        _passedTests++;
    }
}

[TestClass]
public class TestClass : BaseTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        IncrementTests();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        if (TestContext.CurrentTestOutcome == UnitTestOutcome.Passed)
        {
            IncrementPassedTests();
        }
    }

    [TestMethod]
    public void TestMethod1()
    {
    }

    [TestMethod]
    public void TestMethod2()
    {
        Assert.Fail();
    }

    public TestContext TestContext { get; set; }
}

注意:相同的代码可用于 CodedUITests

【讨论】:

  • 我正要实现这个,但我有多个测试类,这意味着每次我在另一个类中执行测试时都会创建一个新对象。这些类中的每一个都是继承自 BaseTestClass 的 TestClass 的新实例。这意味着每个 TestClass 都有自己的计数。我正在检查将无法访问此信息的 AssemblyCleanup 中发送的电子邮件。
  • @PBMax,无论你有多少测试类,我的代码都可以工作。如您所见,BaseTestClass 上的计数器是静态的,因此它们对于测试类的所有不同实例都是相同的。它们只会在下一次测试运行时重置。试试看……
  • 太棒了。我会试试的!
  • 成功了!我稍微更改了实现以从基类本身的 TestInitialize 增加计数器,因此我不必将步骤添加到我的所有测试中。
  • 然后我公开了一个属性来比较结果以确定是否需要发送我的电子邮件。你也帮我在我的代码中找到了一个错误。我不太了解静态概念,并且类的所有实例中只有一个值。我认为每个课程都有自己的价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2018-05-14
  • 2014-01-29
  • 1970-01-01
  • 2012-04-25
  • 2010-09-05
相关资源
最近更新 更多