Как использовать PostSharp для загрузки текста журнала с помощью TestContext.WriteLine - PullRequest
1 голос
/ 25 сентября 2019

У меня есть класс TestBase, из которого происходит каждый тест, класс выглядит следующим образом:

[TestClass]
public class TestBase
{
    public TestContext TestContext { get; set; }

    protected HelperSelenium SeleniumHelper { get; set; }

    [TestInitialize]
    public void TestInitBase()
    {
        SeleniumHelper = new HelperSelenium(TestContext);    
    }
}

Как видите, TestBase создает экземпляр TestContext, который необходим для записи текста в тест (console и debug нежизнеспособны, так как они будут печататься в каждом тесте, который выполняется в данный момент, если он выполняется параллельно).Тогда мне нужно TestContext в [TestMethod], чтобы иметь возможность записать сообщение:

[TestClass]
public class TestMethod1 : TestBase
{
    ...

    [TestInitialize]
    public void TestInit()
    {
        TestContext.WriteLine("Starting TestInitialize...");
        ...
    }

    [TestMethod]
    public void TestMethod1()
    {
        TestContext.WriteLine("Starting TestMethod...");
        ...
    }

    [TestCleanup]
    public void TestCleanup()
    {
        TestContext.WriteLine("Starting TestCleanup...");
        ...
    }

    ...
}

Мой вопрос, возможно ли перехватить TestContext с PostSharp и затем перехватить вызовы на [TestInitialize], [TestMethod] и [TestCleanup], чтобы я мог добавить письменный перевод вне теста.

Я только начинаю с PostSharp и не обладаю большими знаниями, любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 сентября 2019

Для регистрации начала и конца ваших методов тестирования вы можете реализовать пользовательский OnMethodBoundaryAspect .Я понимаю, что вы также хотите использовать свойство TestContext тестового класса для ведения журнала.PostSharp позволяет вам импортировать и получать доступ к члену целевого класса, если вы реализуете IInstanceScopedAspect.

. В качестве отправной точки можно использовать следующий пример:

[PSerializable]
public class TestTracingAttribute : OnMethodBoundaryAspect, IInstanceScopedAspect
{
    private string testMethodName;

    [ImportMember("TestContext")]
    public Property<TestContext> TestContextImported;

    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
    {
        this.testMethodName = method.Name;
    }

    public void RuntimeInitializeInstance()
    {
    }

    public object CreateInstance(AdviceArgs adviceArgs)
    {
        return this.MemberwiseClone();
    }

    public override void OnEntry( MethodExecutionArgs args )
    {
        this.TestContextImported.Get().WriteLine($"Starting {this.testMethodName}");
    }
}

Затем вы можете применить свой собственный атрибут трассировки к вашим тестовым классам и методам.

[TestClass]
[TestTracing]
public class TestClass1
{
}
...