无法为.NetCore App 2.1生成ExtentReport?

时间:2018-12-17 13:40:14

标签: c# macos selenium .net-core extentreports

我正在研究.NetCore App 2.1项目,并使用NUnit框架(在MacOS中)在C#中为该项目创建了一些硒脚本。我能够成功执行它。但是,我无法使用范围报告3.1.3(也尝试过2.41.x)来生成报告,因为我收到警告,它已使用.NETFramework 4.6.1进行了还原,但无法使用带有Project Target的.NetCore应用程序进行还原框架,同时进行编译。当我执行它时,它引发了很多异常。通过添加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. 如果范围报告与.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();
    }
}
}

6 个答案:

答案 0 :(得分:2)

来自github site中的ExtentReports:“当前版本:3.1.0,仅.NET Framework 4.5 +。”

由于.NET 4.5仅是Windows,因此C#版本仅适用于Windows。您将需要在Windows上生成测试报告。

编辑:@foursyth的回复应被认为是权威的,因为他正在研究范围框架。

答案 1 :(得分:2)

对于那些正在寻找适用于.NET Core的ExtentReports的用户,请在当前版本4.03之上查看此fork,该版本不仅支持.NET Core,甚至还支持.NET Statndard :

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

仅在Windows系统上进行了测试,但也应在Mac OS上运行。

答案 2 :(得分:0)

请参见以下内容:

  1. 无法将ExtentReports与.Net Core / Standard一起使用
  2. 不,它不兼容,并且即将发布的版本4也不兼容(它是使用.NET Framework 4.5构建的)。如果您想增加对.NET Core / Standard的支持,我建议发送请求请求(本周将提供版本4的源)。注意:由于不再支持版本3,因此不再接受拉取请求
  3. 这是主观的,取决于您的团队/公司的设置。必须有其他报告工具可以满足这种需求

编辑:

第4版源现已可用,请参见here

根据项目负责人(@anshooarora):“我很高兴添加对.NET Core的支持,但我仍然对所需软件包的支持程度持怀疑态度。我也失去了联系,因此我可能会需要一些帮助才能将其推出。”

答案 3 :(得分:0)

您可以使其正常运行,但需要一点点摆弄。第一个问题是Extent的默认回购中不支持dotnetcore。一家名为Simplytest的公司解决了这一问题,该公司创建了自己当前不接受的PR here

因此,您仍然会遇到问题-Extent使用本身不支持非Windows的Razor Engine。该here有一个未合并的修复程序。

我已经在docker中工作了(它也应该支持mac)。我从here得到的指示将带您到需要去的地方。

  

“ RazorEngine不支持dotnetcore”,“此平台不支持COM Interop”是错误。该PR包含对它的潜在修复#65。我设法使Extent在容器中与dotnetcore一起工作,并将您PR的源代码和RazorEngine PR的源代码作为直接项目引用添加到我的项目中。

     

我的复制+粘贴的源代码结构是:   / src(我的东西)

     

/ Extent / DotnetCoreExtent(您的PR)

     

/ Extent / RazorEnginePatch(提到了PR)

     

我的项目引用了您的项目,并且我更新了您的项目以引用RazorEngine补丁而不是nuget引用。

答案 4 :(得分:0)

请更新至ExtentReports.Core 1.0.3 nuget软件包,该软件包使用RazoreEngine的固定版本,并且现在支持非Windows操作系统。

答案 5 :(得分:0)

将ExtentReports.Core用于.NET核心应用

还要根据您的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/