Как запустить список тестов с помощью VsTest.Console

Как запустить список тестов с помощью vstest.console.exe? Формат .vsmdi предлагал способ указать списки тестов, но этот формат устарел (?).

Я могу запустить явный список тестов в командной строке, что, по сути, делает именно то, что я хочу, но если количество тестов велико (скажем, несколько сотен), тогда мне не хватит места в командной строке!

vstest.console MyTests.dll /Tests:Test1,Test2

Нет ли способа заставить vstest.console.exe запустить список тестов, определенных каким-либо другим способом?

(править: ударение)

Примечание. Я не хочу изменять код теста, например добавлять атрибуты категории теста или изменять схемы именования, чтобы сопоставление имен выбирало подмножество. Мне нужно, чтобы запустить список тестов.

Лучшее, что я могу придумать, это запустить столько, сколько я могу поместиться в пределах максимальной длины командной строки, и повторять до тех пор, пока набор не будет выполнен, а затем объединиться. Но если есть какой-то способ загрузить устаревший список vsmdi или аналогичный, это будет намного проще.

vstest.console MyTests.dll < testnames.txt

vstest.console MyTests.dll /Testlist:testnames.txt

person Anders Forsgren    schedule 28.09.2015    source источник
comment
Вместо этого вы должны использовать переключатель /TestCaseFilter. Это позволяет вам контролировать то, что запускается. Вот [ссылка msdn] (msdn.microsoft.com/en-us/ библиотека/jj155800.aspx)   -  person jeremyh    schedule 16.12.2015
comment
Я не понимаю, как это позволяет мне запускать явный список тестов? Тесты не имеют, например. общий префикс. Если я заставлю фильтр явно сопоставлять имена (Test1 | Test2 | ..), то я вернусь к тому, с чего начал, и мне не хватит места в командной строке!   -  person Anders Forsgren    schedule 17.12.2015
comment
Фильтр поддерживает не только имя класса. В вашем случае вам, вероятно, следует использовать фильтр TestCategory, а затем помечать тестовые классы, которые вы хотите запустить, с помощью атрибута TestCategory. Это позволяет вам классифицировать тесты несколькими способами и запускать только то, что вам нужно, с фильтром в командной строке.   -  person jeremyh    schedule 18.12.2015
comment
Я не могу изменить тесты (имена классов, категории, пространства имен и т. д.). Я хочу запустить подмножество (например, 1000 из них) из заданного списка, который можно динамически изменять между запусками.   -  person Anders Forsgren    schedule 18.12.2015
comment
Что ж, тогда единственный вариант, который я могу придумать, — это разбить их на более мелкие подмножества и запускать vstest.console несколько раз для каждого фрагмента. Похоже, вы находитесь в затруднительном положении с ограниченным контролем над тестовыми классами.   -  person jeremyh    schedule 18.12.2015
comment
Чего я пытаюсь добиться, так это запускать тесты параллельно на многих ядрах, при этом тестовые сборки слишком велики и имеют неравномерный размер для использования в качестве фрагментов. Например, разделите 50 тыс. тестов из 20 сборок на 50 кусков по 1000 тестов и запустите N экземпляров параллельно на N ядрах. Это было легко в mstest, но кажется невозможным в vstest. Преобразование тестов в более мелкие сборки для этой цели также кажется неправильным.   -  person Anders Forsgren    schedule 18.12.2015


Ответы (1)


Вы можете перечислить свои тесты в текстовом файле определенного формата, а затем передать его в vstest.console.exe следующим образом. Предположим, файл называется mytests.orderedtest:

vstest.console mytests.orderedtest

Mytests.orderedtest должен быть в определенном формате. Есть простой способ создать такой тест в Visual Studio, а затем посмотреть его содержимое.

Сначала в Visual Studio щелкните правой кнопкой мыши проект в обозревателе решений, затем выберите «Добавить/Заказанный тест». Это создаст файл ordertest с приятным пользовательским интерфейсом, в который вы сможете добавить свои тесты. Итак, выберите тесты из списка: Test1, Test2. Это создаст файл, который выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
    <OrderedTest name="mytests" storage="c:\src\MyTests\MyTests.orderedtest" id="ed4d22c5-ab9a-4ebd-954f-65ac4c034338" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <TestLinks>
    <TestLink id="14c6766b-c22b-130a-ddb0-53d5ddd6eb1d" name="Test1" storage="..\bin\debug\MyTests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <TestLink id="24c6766b-c22b-130a-ddb0-53d5ddd6eb1d" name="Test2" storage="..\bin\debug\MyTests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </TestLinks>
</OrderedTest>

Если вы собираетесь создать его вручную вне Visual Studio, обратите внимание, что идентификатор GUID в атрибуте id имеет большое значение. Это единственный способ отличить тесты с одинаковыми именами от разных полных имен классов. То есть идентификатор состоит из пространства имен + класса + метода. Эта статья объясняет это: http://blogs.msdn.com/b/aseemb/archive/2013/10/06/how-to-create-an-ordered-test-programmatically.aspx

Вот подпрограмма, которая преобразует полное имя метода в один из следующих GUID:

// convert the test (<Name space name>.<class name>.<test method name>) to a GUID
static Guid GuidFromString(string data) 
{
    SHA1CryptoServiceProvider provider = new SHA1CryptoServiceProvider();
    byte[] hash = provider.ComputeHash(System.Text.Encoding.Unicode.GetBytes(data));
    byte[] toGuid = new byte[16]; 
    Array.Copy(hash, toGuid, 16);
    return new Guid(toGuid); 
}
person zumalifeguard    schedule 18.12.2015
comment
Вы уверены? В документации по командной строке это не упоминается (msdn.microsoft.com/en- us/library/jj155796.aspx), и когда я пытаюсь это сделать, он просто загружает dll и запускает ее (все тесты). Это похоже на стиль командной строки ols mstest.exe - person Anders Forsgren; 19.12.2015
comment
Я уверен. Я пробовал это несколько раз. Я также нашел другую ссылку на StackOverflow, которая показывает то же самое: stackoverflow.com/a/29649319/75129 - person zumalifeguard; 20.12.2015
comment
Спасибо, попробую. Кстати, другой ответ просто опускает тестовую сборку и помещает упорядоченный тестовый файл в качестве входного файла vstest.console somefile.orderedtest, возможно, это то, что нужно сделать. - person Anders Forsgren; 20.12.2015
comment
Это работает, просто нужно быть очень осторожным, чтобы получить ссылки на сборку прямо в файле для конкретной версии VS. Ужасные сообщения об ошибках от vstest.console, в основном, если вы ошибетесь в одном символе, он просто не найдет тестов: / Спасибо! - person Anders Forsgren; 21.12.2015
comment
Спасибо Андрес. Я обновил его, чтобы отразить, что .dll не нужно указывать. Так вы принимаете этот ответ? - person zumalifeguard; 22.12.2015
comment
Да, это правильный ответ. Теперь у меня есть другая проблема: работа со сборкой vstest.console file.dll может выполняться в текущем каталоге, тогда как vstest.console file.orderedtest всегда работает в отдельном каталоге развертывания. Однако я сделаю это отдельным вопросом. - person Anders Forsgren; 22.12.2015