Как программно завершить работающий модульный тест (с помощью Visual Studio c # и инфраструктуры модульных тестов) - PullRequest
0 голосов
/ 23 мая 2019

Если у меня есть автоматический тест, который в настоящее время выполняется, мне нужно выйти из автоматизации, если она столкнется с проблемой, такой как остановка сети или когда тестируемая система (SUT) не работает.

Если я пытаюсь установить Assert.Inconclusive («какое-то сообщение»), оно не будет корректно обрабатывать исключение. Я хочу, чтобы фреймворк записал информацию в логгер, корректно завершил тест и перешел к следующему тесту.

Кто-нибудь имел дело с этой проблемой? Мне нужно сделать что-то вроде этого - (драйвер - Chrome WebDriver (селен)).

// ---- check for services down warning  -----
        bool isDown = await CheckForServicesWarning(driver);
        if (isDown == true)
        {
            Log("XYZ is currently experiencing technical difficulties.");
            return;
        }

1 Ответ

1 голос
/ 30 мая 2019

Вы правы в том смысле, что вам следует проверить доступность внешнего ресурса. Однако вы не трогаете этот ресурс напрямую. Вместо этого вы издеваетесь.

Предположим, что ваш сервис обращается к базе данных и имеет метод ReadCustomerNameById(int id). Сначала распакуйте его в интерфейс, который мы назовем IMyService. Ваш сервис (назовем его MyService) теперь должен реализовать этот интерфейс. И интерфейс, и ваш сервис выглядят так:

public interface IMyService
{
    string ReadCustomerNameById(int id);
}

public class MyService : IMyService
{
    public string ReadCustomerNameById(int id)
    {
        return "Gixabel"; //replace this with your actual implementation
    }
}

Теперь нам нужно написать класс, в котором мы можем использовать MyService и иметь всю бизнес-логику, которая может нам понадобиться. Давайте назовем этот класс Customer и он будет выглядеть так:

public class Customer
{
    private readonly IMyService _service;

    public Customer(IMyService service)
    {
        _service = service;
    }

    public string CustomerNameById(int id)
    {
        var result = _service.ReadCustomerNameById(id);
        //validate, massage and do whatever you need to do to your response
        return result;
    }
}

Я использую здесь какое-то внедрение зависимости. Вне контекста.

Теперь мы готовы написать несколько тестов. Найдите и установите Nuget с именем Moq. Мне лично нравится nUnit, но вы можете легко перевести этот образец на MSTest или любой другой.

Мы начинаем объявлять наш класс Customer и макет MyService. Затем мы создаем экземпляр Customer и макет IMyService в нашей настройке.

Теперь мы делаем нормальный тест, в котором мы предполагаем, что MyService работает правильно.

Последний тест интересный. Мы заставляем сервис генерировать исключение и утверждаем, что это действительно так.

[TestFixture]
public class CustomerTests
{
    private Customer _customer;
    private Mock<IMyService> _myService;

    [SetUp]
    public void Initialize()
    {
        _myService = new Mock<IMyService>();
        _customer = new Customer(_myService.Object);
    }

    [Test]
    public void GivenIdWhenCustomerNameByIdThenCustomerNameReturned()
    {
        const int id = 10;
        const string customerName = "Victoria";
        _myService.Setup(s => s.ReadCustomerNameById(id)).Returns(customerName);
        var result = _customer.CustomerNameById(id);
        Assert.AreEqual(result, customerName);
    }

    [Test]
    public void GivenIdWhenCustomerNameByIdThenException()
    {
        _myService.Setup(s => s.ReadCustomerNameById(It.IsAny<int>())).Throws<Exception>();
        Assert.Throws<Exception>(() => _customer.CustomerNameById(10));
    }
}

Теперь вы полностью отделены от службы, которую пытаетесь использовать. Теперь вы можете выполнять фиксацию в GitHub, Azure Devops и т. Д. И запускать тесты без каких-либо внешних зависимостей.

Кроме того, вы можете попробовать / перехватить, обработать сообщения об ошибках и протестировать их. Но это должно помочь вам.

В качестве примечания попробуйте FluentAssertions. Он читается лучше, чем «Assert.AreEqual ...»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...