我想在TestCleanup()中使用TestResult获取有关测试的一些信息。 但是我不知道如何初始化TestResult对象并获取它。 我想要与TestContext对象相同的行为。
谢谢
private static TestContext _testContext;
[ClassInitialize]
public static void SetupTests(TestContext testContext)
{
_testContext = testContext;
}
编辑: 因此,如果我无法在TestCleanup中访问TestResult,如何在所有测试完成后将所有测试结果写入csv文件?
答案 0 :(得分:1)
您无法访问super.viewDidLoad()
中的TestResult
对象,因为该对象在此阶段尚不存在。测试执行期间,在TestCleanup
和TestCleanup
中花费的时间将合并到TestInitialize
属性中。您可以通过添加类似以下内容来轻松对其进行测试:
TestResult.Duration
在快速执行的[TestCleanup]
public void TestCleanup()
{
Thread.Sleep(1000);
}
中。或者,您可以在TestMethod
上检查Invoke
方法:https://github.com/microsoft/testfx/blob/167533cadfd2839641fc238d39ad2e86b4262be1/src/Adapter/MSTest.CoreAdapter/Execution/TestMethodInfo.cs#L127
此方法将运行您的测试。您可以看到放置TestMethodInfo
和watch.Start()
的位置,以及执行watch.Stop()
方法的位置。此方法将在ExecuteInternal
和RunTestInitializeMethod
之间运行RunTestCleanupMethod
和Start
。
您唯一的解决方案是合并测试类中的所有TestResult,然后在ClassCleanup方法中访问它们。
您可以通过实现自己的Stop
并重写TestMethodAttribute
方法来做到这一点。然后,您可以将所有结果保存在静态属性中-Execute
类中的Results
-并通过TestResultCollection
方法进行访问。这是一个小例子:
TestCleanup
请记住,这更像是黑客,而不是适当的解决方案。最好的选择是实现自己的csv记录器,并通过using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
namespace UnitTestProject
{
[TestClass]
public class UnitTest
{
[ClassCleanup]
public static void ClassCleanUp()
{
// Save TestResultCollection.Results in csv file
}
[MyTestMethod]
public void TestMethod()
{
Assert.IsTrue(true);
}
}
public static class TestResultCollection
{
public static Dictionary<ITestMethod, TestResult[]> Results { get; set; } = new Dictionary<ITestMethod, TestResult[]>();
}
public class MyTestMethodAttribute : TestMethodAttribute
{
public override TestResult[] Execute(ITestMethod testMethod)
{
TestResult[] results = base.Execute(testMethod);
TestResultCollection.Results.Add(testMethod, results);
return results;
}
}
}
开关与vstest.console.exe
一起运行。
答案 1 :(得分:0)
TestMethod属性将TestResult对象的数组返回给适配器。这不是您可以访问的东西。您将需要从TestContext获取信息。