Проанализируйте УСПОКОИТЕЛЬНЫЙ вывод XML Fitnesse в Формат тестирования TFS

Процессы параллельны? Действительно ли производительность является реальным беспокойством? Есть ли несколько 'потоков' выполнения как на веб-сервере? Я не думаю, что существует конечный ответ.

7
задан Jerry Bullard 2 November 2009 в 03:09
поделиться

3 ответа

Формат файла TRX для 2008 года довольно легко сгенерировать, но он не слишком хорошо документирован. Он содержит набор GUIDS - лучшая документация по нему находится в этом сообщении в блоге:

Я написал код, который будет получать выходные данные из JUnit и преобразуйте его в файл TRX. На самом деле это делается в два этапа - первый объединяет все файлы результатов JUnit в один файл и генерирует необходимые GUID, необходимые для файла TRX. Затем он запускает XSLT для объединенного файла XML, чтобы преобразовать его в формат файла TRX перед публикацией в TFS с помощью инструмента командной строки MSTest.exe, который поставляется с выпуском Visual Studio Team (Team Suite, Developer или Test edition).

Вы можете загрузить этот код здесь под лицензией MSPL

0
ответ дан 7 December 2019 в 03:17
поделиться

У меня аналогичная цель в работе, поэтому я создал универсальную программу запуска тестов Fitnesse из командной строки, которая выполняет тест или набор в виде веб-запроса, анализирует полученный XML и преобразует его, используя стиль лист ниже, и, наконец, записывает результат в файл с именем «results.xml» в% TestOutputDirectory%, как указано в Generic Test в Visual Studio.

Файл результатов загружается Visual Studio и анализируется как Файл сводных результатов , в котором указывается количество дочерних тестов, которые прошли или не прошли тест Fitnesse или набор. Подробная информация о формате выходного файла задокументирована здесь , но простой пример выглядит следующим образом при запуске против двухминутного примера Fitnesse в стандартной вики-странице Fitnesse:

<?xml version="1.0" encoding="utf-8"?>
<SummaryResult>
  <TestName>TwoMinuteExample</TestName>
  <TestResult>Failed</TestResult>
  <ErrorMessage>6 right, 1 wrong, 0 ignores and 0 exceptions.</ErrorMessage>
  <InnerTests>
    <InnerTest>
      <TestName>TwoMinuteExample</TestName>
      <TestResult>Failed</TestResult>
      <ErrorMessage>6 right, 1 wrong, 0 ignores and 0 exceptions.</ErrorMessage>
    </InnerTest>
  </InnerTests>
</SummaryResult>

Итак, теперь можно создать Visual Studio «Общий тест» в тестовом проекте для каждого теста / набора Fitnesse, который вы хотите выполнить из Visual Studio или как часть сборки. Общий тест должен указывать путь к исполняемому файлу универсального средства запуска тестов, серверу Fitnesse, порту и имени теста / набора в вики. Для этого необходимо установить флажок для «файла сводных результатов» и ввести «Results.xml», чтобы подробности отображались в выходных данных тестового запуска или сборки.

Я могу поделиться этим кодом с вами, или вы могли бы используйте универсальное средство запуска тестов командной строки и направьте выходные данные в небольшое приложение, которое преобразует результаты с помощью таблицы стилей ниже.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl"
    >
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="GlobalRightCount" select="sum(//result/counts/right)"/>
  <xsl:variable name="GlobalIgnoresCount" select="sum(//result/counts/ignores)"/>
  <xsl:variable name="GlobalWrongCount" select="sum(//result/counts/wrong)"/>
  <xsl:variable name="GlobalExceptionsCount" select="sum(//result/counts/exceptions)"/>
  <xsl:variable name="GlobalFailureCount" select="$GlobalWrongCount + $GlobalExceptionsCount"/>

  <xsl:template match="testResults">
    <SummaryResult>
      <TestName>
        <xsl:value-of select="rootPath"/>
      </TestName>
      <xsl:choose>
        <xsl:when test="$GlobalFailureCount = 0">
          <TestResult>Passed</TestResult>
          <xsl:call-template name="GlobalErrorMessage"/>
        </xsl:when>
        <xsl:otherwise>
          <TestResult>Failed</TestResult>
          <xsl:call-template name="GlobalErrorMessage"/>
        </xsl:otherwise>
      </xsl:choose>
      <InnerTests>
        <xsl:for-each select="result">
          <InnerTest>
            <TestName>
              <xsl:value-of select="relativePageName"/>
            </TestName>
            <xsl:choose>
              <xsl:when test="sum(counts/wrong) + sum(counts/exceptions) = 0">
                <TestResult>Passed</TestResult>
                <xsl:call-template name="ResultErrorMessage"/>
              </xsl:when>
              <xsl:otherwise>
                <TestResult>Failed</TestResult>
                <xsl:call-template name="ResultErrorMessage"/>
              </xsl:otherwise>
            </xsl:choose>
          </InnerTest>
        </xsl:for-each>
      </InnerTests>
    </SummaryResult>
  </xsl:template>


  <xsl:template name="GlobalErrorMessage">
    <ErrorMessage><xsl:value-of select ="$GlobalRightCount"/> right, <xsl:value-of select ="$GlobalWrongCount"/> wrong, <xsl:value-of select ="$GlobalIgnoresCount"/> ignores and <xsl:value-of select ="$GlobalExceptionsCount"/> exceptions.</ErrorMessage>
  </xsl:template>

  <xsl:template name="ResultErrorMessage">
    <ErrorMessage><xsl:value-of select ="sum(counts/right)"/> right, <xsl:value-of select ="sum(counts/wrong)"/> wrong, <xsl:value-of select ="sum(counts/ignores)"/> ignores and <xsl:value-of select ="sum(counts/exceptions)"/> exceptions.</ErrorMessage>
  </xsl:template>
</xsl:stylesheet>

Обновление: добавление общего кода средства запуска тестов

Это определенно просто доказательство концепции, а не обязательно окончательное решение. Возможно, вам удастся совместить эту технику с Мартином Вудвордом ». s ответ, чтобы получить полную картину, в которой сам список тестов является динамическим. Или вы можете изменить средство запуска тестов, чтобы оно запускало все тесты, которые он находит во всей (под) вики. Здесь, вероятно, есть несколько других вариантов.

Следующий код далек от оптимизации, но показывает общий процесс. Вы можете вставить это в новый проект консольного приложения. Обратите внимание, что для этого требуются параметры командной строки, и вы можете указать для них значения по умолчанию в свойствах проекта:

Пример командной строки: localhost 80 FitNesse.UserGuide.TwoMinuteExample

class Program
{
    static int Main(string[] args)
    {
        //Default to error unless proven otherwise
        int returnValue = 1; 

        try
        {
            List<string> commandLineArgs = args.ToList<string>();

            string host = args[0];
            int port = int.Parse(args[1]);
            string path = args[2];
            string testCommand = "suite";

            XmlDocument fitnesseResults = GetFitnesseResult(host, port, path, testCommand);
            XmlDocument visualStudioResults = TransformFitnesseToVisualStudioResults(fitnesseResults);
            visualStudioResults.Save("Results.xml");

            var testResultNode = visualStudioResults.DocumentElement.SelectSingleNode("TestResult");
            var value = testResultNode.InnerText;
            if (value == "Success")
            {
                returnValue = 0;
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        return returnValue;
    }

    private static XmlDocument GetFitnesseResult(string host, int port, string path, string testCommand)
    {
        UriBuilder uriBuilder = new UriBuilder("http", host, port, path, "?" + testCommand + "&format=xml");
        WebRequest request = HttpWebRequest.Create(uriBuilder.Uri);
        request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

        WebResponse response = request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader responseReader = new StreamReader(responseStream);
        string responseString = responseReader.ReadToEnd();

        XmlDocument rawResults = new XmlDocument();
        rawResults.LoadXml(responseString);

        return (rawResults);
    }

    private static XmlDocument TransformFitnesseToVisualStudioResults(XmlDocument fitnesseResults)
    {
        XslCompiledTransform transformer = new XslCompiledTransform(false);
        string codeBase = Assembly.GetEntryAssembly().CodeBase;
        string directory = Path.GetDirectoryName(codeBase);
        string xsltPath = Path.Combine(directory, "FitnesseToSummaryResult.xslt");
        transformer.Load(xsltPath);

        MemoryStream resultsStream = new MemoryStream();
        transformer.Transform(fitnesseResults, null, resultsStream);
        resultsStream.Position = 0;
        XmlDocument results = new XmlDocument();
        results.Load(resultsStream);

        return (results);
    }
}
9
ответ дан 7 December 2019 в 03:17
поделиться

@Jerry, et. др.

Вы сталкивались с этой проблемой? Я запускаю код, очень похожий на приведенный выше. Когда в режиме nUnitTest и URI включает «/? Test & format = xml», тест nUnit завершается сбоем, а IOException: «Невозможно прочитать данные из транспортного соединения: соединение закрыто»

Однако трассировка Fiddler, которая выполнялась в то время, показывает тот самый xml, который я ожидал.

Я воссоздал заголовки запроса точно (почти) так, как они отправляются при отправке через браузер.

Наконец, если я уйду выключив "/? test & format = xml" в URI, я получаю HTML-код, который в противном случае ожидал бы.

Заинтригованы? У меня есть исходный код ... :)

0
ответ дан 7 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: