NUnit
Предположим, что вы используете NUnit (потому что то, что в вопросе выглядит как MSTest), вы можете написать собственный атрибут IWrapTestMethod
для расширения команды теста. Атрибут дает вам возможность проверять результаты теста до и после каждого запуска теста:
// I don't know where your variable is, so just use this dummy class with
// some dummy static properties.
class TestResultKeeper
{
public static TestResult TestResult { get; set; }
public static ResultState ResultState => TestResult?.ResultState ?? ResultState.Failure;
public static bool IsPassed => ResultState == ResultState.Success;
public static Exception Exception { get; set; }
}
// Custom NUnit 3 attribute to extend test method
public class LogTestAttribute : Attribute, IWrapTestMethod
{
public TestCommand Wrap(TestCommand command)
{
// Wrap test command
return new LogTestResultCommand(command);
}
}
class LogTestResultCommand : DelegatingTestCommand
{
public LogTestResultCommand(TestCommand innerCommand)
: base(innerCommand)
{
}
public override TestResult Execute(TestExecutionContext context)
{
try
{
var result = innerCommand.Execute(context);
// Set test result to TestResultKeeper
TestResultKeeper.TestResult = result;
TestResultKeeper.Exception = null;
return result;
}
catch (Exception e)
{
// Exception thrown from test. Test failed.
TestResultKeeper.TestResult = null;
TestResultKeeper.Exception = e.InnerException;
throw;
}
}
}
Использование:
[Test, LogTest]
public void Test1()
{
Assert.Fail();
}
[Test, LogTest]
public void Test2()
{
Assert.Pass();
}
MSTest
Предположим, что ваш test написан на MSTest (в соответствии с вашим примером), вы можете создать новый атрибут метода теста и получить его из TestMethodAttribute
, а также выполнить действия, описанные выше:
class TestResultKeeper
{
public static TestResult TestResult { get; set; }
public static UnitTestOutcome TestOutcome => TestResult?.Outcome ?? UnitTestOutcome.Failed;
public static bool IsPassed => TestOutcome == UnitTestOutcome.Passed;
public static Exception Exception { get; set; }
}
public class LogTestTestMethodAttribute : TestMethodAttribute
{
public override TestResult[] Execute(ITestMethod testMethod)
{
var testResult = base.Execute(testMethod)[0];
TestResultKeeper.TestResult = testResult;
TestResultKeeper.Exception = testResult.TestFailureException;
return new[] { testResult };
}
}
Использование :
[LogTestTestMethod]
public void TestMethod1()
{
}