使用vstest.console.exe工具运行Selenium测试时显示测试的URL

本文关键字:测试 显示 URL Selenium 运行 vstest console exe 工具 使用 | 更新日期: 2023-09-27 17:59:04

上下文

我配置了执行SeleniumC#测试的Jenkins作业。构建作业时,我必须提供两个值:

  • 分支来构建我的解决方案
  • 应测试的URL

详细描述

Jenkins执行以下步骤:

  • 签出所选分支
  • 将存储在AppSettings中的URL替换为用户提供的URL("TestedURL")
  • 生成解决方案
  • 执行vstest.console.exe工具(该工具随Visual Studio 2012一起提供,位于以下路径中:"Microsoft Visual Studio 11.0''Common7''IDE''CommonExtensions''Microsoft''TestWindow"),如下所示:

    vstest.console.exe"c:''myProject''bin''Debug''myProject.Test.dll"

问题

我想确保测试正确的URL:我想在Jenkins/vstest.console.exe输出的控制台输出中显示URL。

我在StackOverflow上按照不同的答案修改了代码。

URL直接在Visual Studio的测试输出中可见。不幸的是,在vstest.console.exe/Jenkins输出中,我仍然没有看到任何测试URL。

如何在输出中显示URL(如何修改printMessage方法)?

我的代码如下:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Configuration;
using System.Diagnostics;
namespace My.Test
{
    [TestClass]
    public class MyTests
    {
        IWebDriver driver;
        string baseURL;
        [TestInitialize]
        public void Initialize()
        {
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            // URL is replaced by the value provided in Jenkins
            baseURL = config.AppSettings.Settings["TestedURL"].Value;
            driver = new ChromeDriver();
            driver.Navigate().GoToUrl(baseURL);
            printMessage(string.Format("Tested URL: '{0}'", baseURL));
        }
        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;
            }
        }
        private void printMessage(string message)
        {
            // Method should display custom message in both Visual Studio output and Jenkins (vstest.console.exe) output
            Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
            Trace.Listeners.Add(new ConsoleTraceListener());
            Trace.WriteLine(message);
            Debug.WriteLine(message);
            TestContext.WriteLine(message);
            Console.WriteLine(message);
        }
    }
}

使用vstest.console.exe工具运行Selenium测试时显示测试的URL

由于找不到直接的解决方案,我找到了一个变通方法。

vstest.console.exe具有/logger:trx选项,该选项生成扩展名为.trx的文件。提到的文件是一个xml,其中包含测试结果和Std输出。我注意到,当我在测试方法中使用printmessage时,消息就在那里(在trx文件的Std输出中)。

让我提供生成的.trx文件的一部分:

<Output>
    <StdOut>Tested URL was 'http://someURL'
Debug Trace:
Tested URL: 'http://someURL'
Trying to log into as 'Incorrect account'
TestContext Messages:
Tested URL: 'http://someURL'
Trying to log into as 'Incorrect account'</StdOut>
      </Output>
    </UnitTestResult>

有一些工具可以将.trx转换为.html。因此Jenkins可以在控制台中显示测试结果的输出链接。


但是

我遇到了问题,因为我找不到一个能正常工作并在生成的html文件中显示Std输出的工具。从那以后,我写了以下Powershell代码:

# set $inputTRXFile, $outputHTMLFile before running following lines
$results = ([xml] (Get-Content $inputTRXFile)).TestRun.Results.UnitTestResult
$results | select testname,outcome,duration, @{Name="Output";Expression={$_.Output.InnerText}} | ConvertTo-HTML -head $a -title "Test results" | Out-File $outputHTMLFile