无法为 .Net Core App 2.1 生成范围报告?

Unable to generate ExtentReport for .NetCore App 2.1?

我正在处理 .NetCore App 2.1 项目,我使用 NUnit 框架(在 MacOS 中)在 C# 中为该项目创建了一些 selenium 脚本。我能够成功执行它。但是,我无法使用 Extent Report 3.1.3(另外,已尝试 2.41.x)生成报告,因为我收到警告,它已使用 .NETFramework 4.6.1 恢复,但不是使用 .NetCore带有 Project Target 框架的应用程序,同时编译。当我执行它时,它给我带来了很多异常。我通过添加 Nuget 包一一解决。最后,我陷入了以下异常,我无法从中进一步移动。

TearDown failed for test fixture RBAutomationDemo.UnitTest1
TearDown : System.TypeLoadException : Could not load type 'System.Security.Principal.WindowsImpersonationContext' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
--TearDown
 at RazorEngine.Compilation.DirectCompilerServiceBase.CompileType_Windows(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource 
razorTemplate, Type modelType)
  at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
  at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
  at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
  at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
  at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
  at AventStack.ExtentReports.Reporter.ExtentHtmlReporter.Flush()
  at AventStack.ExtentReports.Model.Report.<>c.<NotifyReporters>b__29_1(IExtentReporter x)
  at System.Collections.Generic.List`1.ForEach(Action`1 action)
  at AventStack.ExtentReports.Model.Report.NotifyReporters()
  at AventStack.ExtentReports.Model.Report.Flush()
  at AventStack.ExtentReports.ExtentReports.Flush()
  at RBAutomationDemo.UnitTest1.OneTimeTearDown()`

请帮我解决这个问题。

  1. 是否可以在 .NetCore 2.1(在 MacOS 中)中使用范围报告?如果 所以请给我提供实现它的步骤。
  2. 如果 Extent Reports 与 .NetCore app 2.1 不兼容,请推荐更好的报告工具作为替代(首选开源)
  3. 我将在 VSTS 中 CI 它。 这种情况真的需要单独报告吗?

我使用的代码:

using System;
using AventStack.ExtentReports;
using AventStack.ExtentReports.Reporter;
using LocatorsFile;
using NUnit.Framework;
using NUnit.Framework.Interfaces;

namespace RBAutomationDemo
{
    [SetUpFixture]
    public abstract class Base
    {
    protected ExtentReports _extent;
    protected new ExtentTest _test;

    [OneTimeSetUp]
    protected void ReportSetup()
    {
        var dir = TestContext.CurrentContext.TestDirectory + "\";
        var fileName = this.GetType().ToString() + ".html";
        System.Console.WriteLine(fileName);
        ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(dir + fileName);

        _extent = new ExtentReports();
        _extent.AttachReporter(htmlReporter);
    }

    [OneTimeTearDown]
    protected void ReportTearDown()
    {
        _extent.Flush();
    }



    [SetUp]
    public void BeforeTest()
    {
        _test = _extent.CreateTest(TestContext.CurrentContext.Test.Name);
        Initialize();
    }

    [Test]
    public void Testmethod1()
    {
        _test = extent.CreateTest("Checking Total workbooks count");

        try
        {
            _test.Pass("Assertion passed");
            _test.Log(Status.Pass, "Pass");
        }
        catch
        {
            _test.Fail("Assertion failed");
            _test.Log(Status.Fail, "Fail");
            throw;
        }

    }


    [TearDown]
    public void AfterTest()
    {
        var status = TestContext.CurrentContext.Result.Outcome.Status;
        var stacktrace = string.IsNullOrEmpty(TestContext.CurrentContext.Result.StackTrace)
                ? ""
                : string.Format("{0}", TestContext.CurrentContext.Result.StackTrace);
        Status logstatus;

        switch (status)
        {
            case TestStatus.Failed:
                logstatus = Status.Fail;
                break;
            case TestStatus.Inconclusive:
                logstatus = Status.Warning;
                break;
            case TestStatus.Skipped:
                logstatus = Status.Skip;
                break;
            default:
                logstatus = Status.Pass;
                break;
        }

        _test.Log(logstatus, "Test ended with " + logstatus + stacktrace);
        _extent.Flush();
        DoTearDown();
    }
}
}

请看下面:

  1. 无法将 ExtentReports 与 .Net 一起使用 Core/Standard
  2. 不,它不兼容,即将推出的版本 4 也不兼容(它是使用 .NET Framework 4.5 构建的)。如果您想添加对 .NET Core/Standard 的支持,我建议您发送拉取请求(版本 4 源代码将于本周提供)。注意:版本 3 不再接受拉取请求,因为它不再受支持
  3. 这是主观的,取决于您的 team/company 设置。必须有其他报告工具支持此需求

编辑:

版本 4 源现已可用,请参阅 here

根据项目所有者 (@anshooarora):"I am happy to add support for .NET core but I am still a little skeptical how well supported the required packages are. I have also been out of touch so I would probably need some help to roll this out."

来自 github site 的 ExtentReports:"Current Version: 3.1.0, .NET Framework 4.5+ only."

由于 .NET 4.5 仅 windows,因此 C# 版本仅适用于 Windows。您需要在 windows.

上生成测试报告

编辑:@foursyth 的回复应该被认为是权威的,因为他在 Extent Framework 上工作。

对于正在寻找适用于 .NET Core 的 ExtentReports 工作版本的用户,请查看当前版本 4.03 之上的 fork,它不仅支持 .NET Core,甚至还支持 . NET 标准:

https://www.nuget.org/packages/ExtentReports.Core

仅在 Windows 系统上测试过,但也应该适用于 Mac OS。

你可以让它工作,但需要一些小改动。第一个问题是 Extent 的默认 repo 不支持 dotnetcore。这是由一家名为 simplytest 的公司解决的,该公司创建了他们自己的当前未被接受的 PR here.

有了这个,你仍然会 运行 遇到问题,但是 Extent 使用 Razor 引擎,它本身不支持非 windows。 here.

有一个未合并的修复

我已经在 docker 中完成了这项工作(它也应该支持 mac)。我来自 here 的指示将带您到达您需要去的地方。

The 'COM Interop is not supported on this platform' is an error with the RazorEngine not supporting dotnetcore. This PR contains a potential fix to it #65. I've managed to get Extent working with dotnetcore in a container with your PR's source code and the source code of the RazorEngine PR added to my project as direct project references.

My copy+pasted source code structure is: /src (my stuff)

/Extent/DotnetCoreExtent (your PR)

/Extent/RazorEnginePatch (the PR mentioned)

My project refers to your project, and I've updated your project to reference the RazorEngine patch instead of the nuget reference.

请更新到 ExtentReports.Core 1.0.3 nuget 包,它使用固定版本的 RazoreEngine,现在支持非 windows OS。

对 .NET 核心应用程序使用 ExtentReports.Core

还可以根据您的 dotnet 核心版本以任意顺序添加这些 nuget 包

  • System.Configuration.ConfigurationManager
  • MongoDB.Bson
  • MongoDB.Driver.Core
  • MongoDB.Driver
  • Newtonsoft.Json
  • RazorEngine.NetCore 如果添加此 nuget 包 System.Configuration.ConfigurationManager.
  • ,则不会发生该异常 System.TypeLoadException

参考 - http://extentreports.com/documentation/