Тести написання одиниць для класу, що починається із зовнішнього EXE


9

Я написав клас C #, який використовується для створення списку EXE (не один з моїх - сторонніх EXE, які я маю запускати) і продовжувати їх працювати (періодично перевірятимуть, що він все ще працює, і запускати їх, якщо ні) .

Я в змозі перевірити основну логіку додавання, видалення тощо. Як я можу перевірити, чи буде працювати фактична робота з зберігання EXE?

Моя початкова думка - запустити якийсь манекен EXE, який закриється через 1 секунду, а потім використати його для тестування. Це поза сферою Тестування одиниць?

Відповіді:


12

Моя початкова думка - запустити якийсь манекен EXE, який закриється через 1 секунду, а потім використати його для тестування. Це поза сферою Тестування одиниць?

Це хороший тест? Впевнені, так що створіть. Це "одиничний тест" у реальному розумінні цього слова? Я не думаю, що я би назвав це "тестом на систему" або чимось подібним, але це не робить тест менш цінним.


9

Знущайтеся над цим на більш високому рівні. Створіть клас проксі навколо Process.Start(), підробіть це в тесті і перевірте вхідні дані.

public interface IProcessProxy
{
     ProcessInfo Start(string application, string[] arguments);
}

public class ProcessProxy : IProcessProxy
{
    public ProcessInfo Start(string application, string[] arguments)
    {
        return Process.Start(application, arguments);
    }
}

// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
    private string _expectedApplication;
    private string[] _expectedArguments;
    private ProcessInfo response;

    public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
    {
         _expectedApplication = expectedApplication;
         _expectedArguments = expectedArguments;
    }

    public ProcessInfo Start(string application, string[] arguments)
    {
         // compare input to expectations and throw exception if not matching
         return _response;
    }
}

// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
    public ClassUnderTest(IProcessProxy proxy)
    {
        _proxy = proxy;
    }

    public ClassUnderTest() : this(new ProcessProxy())
    {
    }

    public void MethodUnderTest()
    {
        // Do stuff

        ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            // Act on success
        }
        else
        {
            // Act on failure
        }
    }   
}

Де б вам не було потрібно використовувати ClassUnderTest у коді програми, використовуйте конструктор за замовчуванням. У своїх тестах передайте FakeProcessProxy іншому конструктору, використовуючи очікувані параметри запуску проксі і ваш результат тесту в конструкторі підроблених.


4

Якщо чітко дотримуватися філософії тестування на одиницях (акцент на одиницю ), ви не повинні створювати Exe-файл, а замість цього перевіряти, чи ваш клас викликає інтерфейси для нерестування та моніторингу цього процесу правильно. Зрештою, ви хочете перевірити свій клас, а не бібліотеку, відповідальну за обробку процесів.

Але з прагматичної точки зору ваш підхід чудовий, хоча 1 секунда здається трохи довгою.


1

Я зробив щось подібне, але просто зателефонував ping localhost. Заощаджує клопот щодо розміщення виконуваних файлів на вашому сервері збірки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.