Могу ли я использовать 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
файл как обычно.