【问题标题】:How to find type of project with cake build system?如何使用蛋糕构建系统查找项目类型?
【发布时间】:2021-02-12 13:42:44
【问题描述】:

ITNOA

我使用 cake build system 自动构建我的解决方案,我想在我们的 CI 中使用 cake 自动测试我的项目,

我的 NUnit 项目有很多类型,例如 asp.net dot net framework 4.6.1 或 dot net core 2.1 或 ...

我的问题是当我想用NUnit3 cake dsl 运行我们的单元测试时,我们需要知道每个项目的 dll 路径,所以我需要知道每个项目的类型是什么,因为例如 dot net core 2.1 dll 是在 netcoreapp 目录下,另一个项目的 dll 在其他地方。

为了更好的演示,请看下图

正如您在测试解决方案文件夹中看到的,我们有许多具有不同类型框架的测试项目......(例如其中一个是 dotnetcore2.1 另一个是 dot net framework 4.6.1 等等)

所以我的问题是如何找到项目类型?

NUnit3自己找到dll有什么解决办法吗?

my GitHub discussion about this question

谢谢

【问题讨论】:

  • 不应该是从你的测试项目到被测项目的简单项目引用吗?
  • 不,我的每个测试项目都有不同的类型
  • 您的设置确实不清楚。例如,您不会为每个项目或至少每个运行时类型都有一个测试项目吗?我的意思是你不能在同一个运行时测试一个 dotnet 核心和一个 .Net-Framework 项目。另外,您如何配置首先应该测试哪些项目?请添加有关您的问题解决方案的结构信息。
  • 我更新我的问题以清除
  • 所以问题是识别例如的运行时类型*Commons.Tests 而不是*.Commons

标签: c# msbuild build-system cakebuild


【解决方案1】:

您应该为单元测试项目使用项目引用,而不是显式的 DLL 引用。

当您使用 .Net Core 时,使用 XUnit 测试允许您的测试方法使用几乎相同的过程。

通过使用项目参考并将您的测试项目作为同一个解决方案 (sln) 文件的一部分,您将大大简化您的工作。

【讨论】:

  • 我更新了我的问题以提供更多信息并明确含义
  • 为什么不能使用直接引用解决方案中项目的测试项目? (TIL) NUnit 支持 .Net Core 和 .Net 框架,您只需为它们各自编译一个解决方案类型。
  • NUnit3 Runner in cake 不支持 dot net core 项目,所以我必须根据框架为每个项目使用不同的 runner
  • 如果您将测试运行程序项目添加为解决方案的一部分,CAKE“应该”嵌入对处理项目的支持。但是,我不是 CAKE 方面的专家。对不起。我无法协助 CAKE 集成。 :( 这可能有助于为您的问题提供方向,但不包含整个解决方案。它可以让您检测参考,这可以让您确定语言类型。stackoverflow.com/questions/46307971/…
【解决方案2】:

看起来您正在尝试做的是为您的单元测试获取所有程序集的列表,涵盖项目可能具有的任何目标。

如果是这种情况,您可以使用GetFiles 别名来查找程序集,然后检查每个程序集的FullPath 以检查TFM...

var files = GetFiles("./**/*.Tests.dll");
foreach(var file in files)
{
    Information("File: {0}", file.FullPath);

    if (file.FullPath.Contains("/net461/")
    {
        // ... Assembly is for .NET 4.6.1
    }
    else if (file.FullPath.Contains("/netcoreapp2.1/")
    {
        // ... Assembly is for .NET Core 2.1
    }
    // etc...
}

【讨论】:

  • 最好在路径上执行正则表达式,例如 .Net 框架的“\//net[\d]*\/”或“\/netcoreapp[\d]*\ .[\d]*\/" 以允许每个库的多个版本。但是,这将应用与您的管道兼容的断言。喜欢使用生成的路径而不是读取文件的想法。
【解决方案3】:

您可以使用 globber 模式来查找所有测试项目,不知道您是 exakt 文件夹结构,但您可以执行以下操作

 Task("Test")
     .Does(() =>
 {
     var settings = new DotNetCoreTestSettings
     {
         Configuration = "Release"
     };

     var projectFiles = GetFiles("./**/Test/UnitTests/*.csproj");
     foreach(var file in projectFiles)
     {
         DotNetCoreTest(file.FullPath, settings);
     }
 });

【讨论】:

  • 我不能使用DotNetCoreTest,因为对于dotnet框架我必须使用NUnit3,对于dotnetcore 2.1我必须使用VSTest,对于dotnetcore 3.1我必须使用DotNetCoreTest,所以我必须找到一种方法来确定项目框架输入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2014-11-10
  • 2021-01-12
相关资源
最近更新 更多