Могу ли я использовать IntelliTest для создания разумных юнит-тестов?

Документация Microsoft для IntelliTest гласит:

IntelliTest исследует ваш код.NET для генерации тестовых данных и набора модульных тестов. Для каждого оператора в коде генерируется тестовый ввод, который будет выполнять этот оператор. Анализ случая выполняется для каждой условной ветви в коде. Например, if операторы, утверждения и все операции, которые могут генерировать исключения, анализируются. Этот анализ используется для генерации тестовых данных для параметризованного модульного теста для каждого из ваших методов, создавая модульные тесты с высоким охватом кода.

Я использую Visual Studio 2017. Я щелкнул правой кнопкой мыши внутри моего метода, выбрал "IntelliTest", а затем "Создать IntelliTest". Я принял все значения по умолчанию во всплывающем диалоговом окне и нажал "ОК".

    public static int ScanInternalInbox()
    {
        if (<code removed>)
        {
            <code removed>;
        }

        <code removed>;

        try
        {
            <code removed>;
        }
        catch (Exception e)
        {
            <code removed>;
            return 0;
        }

        <code removed>;

        try
        {
            <code removed>;
        }
        catch (Exception e)
        {
            <code removed>;
        }

        <code removed>;
        foreach (<code removed>)
        {
            <code removed>;

            if (<code removed>)
            {
                if (<code removed>)
                {
                    <code removed>;

                    if (<code removed>)
                    {
                        foreach (<code removed>)
                        {
                            <code removed>;
                            if (<code removed>)
                            {
                                if (<code removed>)
                                {
                                    <code removed>;
                                }
                            }
                        }

                        if (<code removed>)
                        {
                            if (<code removed>)
                            {
                                <code removed>;
                            }
                            else
                            {
                                <code removed>;
                            }
                        }
                    }
                    else
                    {
                        <code removed>;
                    }
                }
                else
                {
                    <code removed>;
                }                    
            }
            else
            {
                <code removed>;
            }
        }

        <code removed>;
    }

Почему тогда, мой метод со многими, многими (слишком много) ifпросто сгенерировать этот код модульного теста?

public partial class HMR_AgentTest {

  /// <summary>Test stub for ScanInternalInbox()</summary>
  [PexMethod]
  public int ScanInternalInboxTest() {
    int result = global::HMR_Agent.HMR_Agent.ScanInternalInbox();
    return result;
    // TODO: add assertions to method HMR_AgentTest.ScanInternalInboxTest()
  }
}

Я ожидал получить хотя бы один тест для каждого if, чтобы покрыть код (почти) полностью. Я сделал что-то неправильно? Есть ли способ генерировать тесты по умолчанию так, как заявляет Microsoft?

РЕДАКТИРОВАТЬ

Теперь я тоже запустил IntelliTest, и он сгенерировал следующий код:

  public partial class HMR_AgentTest {

[TestMethod]
[PexGeneratedBy(typeof(HMR_AgentTest))]
[PexRaisedException(typeof(TypeInitializationException))]
public void ScanInternalInboxTestThrowsTypeInitializationException908()
{
    int i;
    i = this.ScanInternalInboxTest();
    Assert.AreEqual<int>(-1, i);
}
  }

Тест не пройден, потому что выдается исключение, даже если тест ожидает, что будет выдано исключение.

1 ответ

[PexMethod] фактически просто определяет функцию, которую вы хотите проверить. Вам нужно щелкнуть правой кнопкой мыши и "IntelliTest -> Запустить IntelliTest" на PexMethod в первый раз, чтобы создать ребенка .g.cs файл, который содержит тесты для всех путей выполнения.

Вы снова запускаете IntelliTest только тогда, когда вносите изменения в код, который изменяет пути выполнения или поведение; если вы просто рефакторинг кода, вам не нужно создавать новый тестовый код, вы просто запускаете сгенерированный [TestMethod] тесты в g.cs файл как обычно.

Другие вопросы по тегам