Как написать вывод из unit test?
Любой вызов в моих модульных тестах на Debug.Write(line)
или Console.Write(Line)
просто пропускается во время отладки и вывод никогда не печатается. Вызов этих функций изнутри классов, я использую работу отлично.
Я понимаю, что модульное тестирование предназначено для автоматизации, но я все равно хочу получать сообщения от unit test.
Ответы
Ответ 1
Попробуйте использовать TestContext.WriteLine()
, который выводит текст в результатах теста.
Пример:
[TestClass]
public class UnitTest1
{
private TestContext testContextInstance;
/// <summary>
/// Gets or sets the test context which provides
/// information about and functionality for the current test run.
///</summary>
public TestContext TestContext
{
get { return testContextInstance; }
set { testContextInstance = value; }
}
[TestMethod]
public void TestMethod1()
{
TestContext.WriteLine("Message...");
}
}
"Волшебство" описывается в MSDN как "Среда тестирования автоматически устанавливает свойство, которое затем можно использовать в модульных тестах".
Ответ 2
Немного поздно к разговору.
Я также пытался заставить Debug, Trace, Console или TestContext работать в модульном тестировании.
Ни один из этих методов не будет работать или показывать вывод в окне вывода.
Trace.WriteLine("test trace");
Debug.WriteLine("test debug");
TestContext.WriteLine("test context");
Console.WriteLine("test console");
VS2012 и Большой
(из комментариев) В Visual Studio 2012 нет значка. Вместо этого в результатах теста есть ссылка Output. Если вы нажмете на ссылку, вы увидите все WriteLine
.
До VS2012
Затем я заметил, что в моем окне Результаты теста после запуска теста рядом с зеленым кружком с небольшим успехом есть еще один значок, который я дважды щелкнул по нему. Это были результаты моего теста, и он включал все типы писем выше.
Ответ 3
В Visual Studio 2017 вы можете увидеть выходные данные из тестового проводника.
1) В вашем тестовом методе Console.WriteLine("что-то");
2) Запустите тест.
3) В окне "Проводник тестов" нажмите "Пройденный метод тестирования".
4) И нажмите ссылку "Вывод".
![enter image description here]()
И нажмите "Вывод", вы можете увидеть результат Console.Writeline().
![enter image description here]()
Ответ 4
Это зависит от вашего тестового бегуна... например, я использую XUnit, поэтому в случае, что вы используете, следуйте этим инструкциям:
https://xunit.github.io/docs/capturing-output.html
Этот метод группирует ваш вывод с каждым конкретным модульным тестом.
using Xunit;
using Xunit.Abstractions;
public class MyTestClass
{
private readonly ITestOutputHelper output;
public MyTestClass(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public void MyTest()
{
var temp = "my class!";
output.WriteLine("This is output from {0}", temp);
}
}
В ссылке, предоставленной мною для записи в ваше окно вывода, указан другой метод, но я предпочитаю предыдущий.
Ответ 5
Я думаю, что это все еще актуально.
Вы можете использовать этот пакет NuGet:
https://www.nuget.org/packages/Bitoxygen.Testing.Pane/
Вызвать собственный метод WriteLine из этой библиотеки.
Он создает тестовую панель внутри окна вывода и всегда размещает сообщения (во время каждого тестового прогона независимо от флагов DEBUG и TRACE).
Чтобы сделать трассировку проще, я могу порекомендовать создать базовый класс:
[TestClass]
public abstract class BaseTest
{
#region Properties
public TestContext TestContext { get; set; }
public string Class
{
get { return this.TestContext.FullyQualifiedTestClassName; }
}
public string Method
{
get { return this.TestContext.TestName; }
}
#endregion
#region Methods
protected virtual void Trace(string message)
{
System.Diagnostics.Trace.WriteLine(message);
Output.Testing.Trace.WriteLine(message);
}
#endregion
}
[TestClass]
public class SomeTest : BaseTest
{
[TestMethod]
public void SomeTest1()
{
this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
}
}
Ответ 6
Решено с помощью следующего примера:
public void CheckConsoleOutput()
{
Console.WriteLine("Hi Hi World");
Trace.WriteLine("Trace Trace the World");
Debug.WriteLine("Debug Debug WOrld");
Assert.IsTrue(true);
}
После выполнения этого теста в разделе "Пройдено тестирование" есть возможность просмотреть вывод, который откроет окно вывода.
Ответ 7
Попробуйте использовать:
Console.WriteLine()
Вызов Debug.WriteLine
будет выполняться только во время определения DEBUG.
Другие предложения должны использовать: Trace.WriteLine
, но я этого не пробовал.
Существует также опция (не уверен, что VS2008 имеет ее), но вы все равно можете использовать Debug.WriteLine
при запуске теста с параметром Test With Debugger
в среде IDE
Ответ 8
Вы уверены, что выполняете свои модульные тесты в Debug? Debug.WriteLine не будет настроен в версиях выпуска.
Два возможных варианта:
-
Trace.WriteLine(), который встроен в сборки выпуска inot, а также debug
-
Отмените определение DEBUG в настройках сборки для unit test
Ответ 9
Я не получаю никакого вывода, когда мои настройки Test/Test Settings/Default Processor Architecture и сборки, которые ссылаются на мои тестовые проекты, не совпадают. В противном случае Trace.Writeline() работает нормально.
Ответ 10
Я использую xunit, поэтому это то, что я использую: Debugger.Log(0, "1", input);
PS: вы можете использовать Debugger.Break();
, чтобы вы могли войти в систему out
Ответ 11
Trace.WriteLine
должен работать, если вы выберете правильный вывод (раскрывающийся список с надписью "Show output from", найденный в окне "Выход" )
Ответ 12
Console.WriteLine не будет работать. В режиме отладки будет работать только Debug.WriteLine() или Trace.WriteLine().
Я делаю следующее: включаю с помощью System.Diagnostics в тестовый модуль. Затем используйте Debug.WriteLine для моего вывода, щелкните правой кнопкой мыши на тесте, выберите Отладить выбранные тесты. Результат вывода теперь появится в окне "Вывод" ниже. Я использую Visual Studio 2017 vs 15.8.1, со стандартным фреймворком модульного тестирования, который обеспечивает VS.
Ответ 13
Просто столкнулся с этим. Причина/решение - другой вариант вышеупомянутого, поэтому я отправлю.
Моя проблема заключалась в том, что я не получал вывод, потому что я записывал набор результатов из асинхронного вызова Linq на консоль в цикле в асинхронном контексте:
var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");
p.ForEachAsync(payment => Console.WriteLine(payment.Amount));
и поэтому тест не записывал данные в консоль, пока объект консоли не был очищен средой выполнения (при запуске только одного теста).
Решением было сначала преобразовать набор результатов в список, чтобы я мог использовать не асинхронную версию forEach():
var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();
p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
Ответ 14
Это действительно зависит от участника теста, как упомянул @jonzim.
Для NUnit 3 мне пришлось использовать NUnit.Framework.TestContext.Progress.WriteLine()
, чтобы запустить вывод в окне вывода Visual Studio 2017.
NUnit описывает, как: здесь
Насколько я понимаю, это вращается вокруг дополнительной распараллеливания выполнения теста, который получили участники теста.