Continuous integration 如何为“指定正确的搜索掩码”;测试组件文件规范“;TFS2010生成定义中的对话框?

Continuous integration 如何为“指定正确的搜索掩码”;测试组件文件规范“;TFS2010生成定义中的对话框?,continuous-integration,mstest,tfsbuild,Continuous Integration,Mstest,Tfsbuild,我不知道如何指定正确的掩码以在TFS2010生成定义中搜索我的测试程序集。 我没有为输出程序集使用默认二进制文件文件夹。每个测试项目都有自己的bin\Debug或bin\Release输出文件夹。 如果我使用默认掩码**\*test*.dll,我的测试失败,出现以下错误: API restriction: The assembly 'file:///E:\Builds\....\obj\Debug\xxx.IntegrationTests.dll' has already loaded fro

我不知道如何指定正确的掩码以在TFS2010生成定义中搜索我的测试程序集。 我没有为输出程序集使用默认二进制文件文件夹。每个测试项目都有自己的bin\Debug或bin\Release输出文件夹。 如果我使用默认掩码**\*test*.dll,我的测试失败,出现以下错误:

API restriction: The assembly 'file:///E:\Builds\....\obj\Debug\xxx.IntegrationTests.dll' 
has already loaded from a different location. It cannot be loaded from a new location within the same appdomain.
这是因为**\*test*.dll掩码将在bin\Debug和obj\Debug文件夹中找到同一程序集的多个结果

我试图更改此掩码以排除obj\Debug文件夹并仅使用bin:

**\bin\Debug\*test*.dll
**\bin\**\*test*.dll
**\Debug\*test*.dll
但FindMatchingFiles活动始终返回0个结果

只有当我通过测试程序集的完整路径时,它才起作用

如果要从测试程序集搜索中排除obj\Debug文件夹,正确的掩码是什么

解决方法
我仍在使用FindMatchingFiles活动,但我必须使用以下参数添加Assign活动:

To - testAssemblies
From - testAssemblies.Where(Function(o) Not o.Contains("\obj\")).ToList()

我正在以这种方式筛选“obj”文件夹中找到的所有测试程序集。

您感兴趣的生成活动名为“查找测试程序集”:

因此,在构建定义中放置的内容连接在构建脚本变量
outputDirectory
之后

outputDirectory
针对活动“初始化outputDirectory”中的每个配置进行初始化:

您可以对新生成进行排队,将“日志详细性”设置为
Diagnostic
。一旦运行(并失败),请检查您的构建正在发生什么


我猜您的配置/平台设置有问题,但没有具体的输入,这只是猜测。

可能是过滤器开头的
**
问题。搜索的起点位于您不期望的位置,并且子目录不包含您的测试文件

要解决此问题,请在筛选器表达式的开头添加
。\..\
。出于调试目的,这将从您所在的子目录结构中取出,并在系统上对测试文件执行更广泛的搜索。您还可以将第一部分设置为绝对,以确保在正确的目录子树中搜索

作为替代方案,您还可以在生成系统上运行会话,以查看TFS生成引擎实际在哪里查找测试程序集。或者在构建工作流/活动本身中执行一些日志记录


找到问题后,再次缩小搜索窗口,不要搜索不相关的子目录结构。

我遇到了与您基本相同的问题。我让开发人员使用一个助手测试程序集(TestHelper)和一个_PublishedWebsites文件夹,这导致了这个问题

我最终解决了将多个相同的测试DLL传递给MSTest的问题。“嗯,这就是我试图用我的面具做的,”你可能会想!我尝试了同样的解决方案,但结果是空的

我编写了一个自定义任务,并在构建过程找到测试程序集后将其插入。以下是自定义任务的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
using System.Activities;
using System.IO;

namespace BuildTasks.Activities
{
  [BuildActivity(HostEnvironmentOption.All)]
  public class DistinctFileList : CodeActivity<IEnumerable<String>>
  {
    public InArgument<IEnumerable<String>> ListIn { get; set; }

    protected override IEnumerable<String> Execute(CodeActivityContext context)
    {
      IEnumerable<string> listIn = context.GetValue(this.ListIn);

      context.TrackBuildMessage("Items in ListIn: " + listIn.Count(), BuildMessageImportance.High);

      var filenameGroupings = listIn.Select(filename => new FileInfo(filename.ToString()))
        .GroupBy(fileInfo => fileInfo.Name);

      IEnumerable<string> listOut = filenameGroupings.Select(group => group.FirstOrDefault().FullName);

      context.TrackBuildMessage("Items in out list: " + listOut.Count(), BuildMessageImportance.High);

      string multiples = string.Join(", ",
        filenameGroupings.Where(group => group.Count() > 1).SelectMany(group => group.Select(fileInfo => fileInfo.FullName)).ToArray());

      context.TrackBuildMessage("Duplicate test items: " + multiples, BuildMessageImportance.High);

      return listOut.ToList();
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.TeamFoundation.Build.Client;
使用Microsoft.TeamFoundation.Build.Workflow.Activities;
使用系统活动;
使用System.IO;
命名空间BuildTasks.Activities
{
[BuildActivity(HostenEnvironmentOption.All)]
公共类DistinctFileList:CodeActivity
{
公共InArgument列表{get;set;}
受保护的重写IEnumerable执行(CodeActivityContext上下文)
{
IEnumerable listIn=context.GetValue(this.listIn);
TrackBuildMessage(“ListIn中的项:+ListIn.Count(),BuildMessageImportance.High”);
var filenameGroupings=listIn.Select(filename=>newfileinfo(filename.ToString()))
.GroupBy(fileInfo=>fileInfo.Name);
IEnumerable listOut=filenameGroupings.Select(group=>group.FirstOrDefault().FullName);
TrackBuildMessage(“输出列表中的项目:+listOut.Count(),BuildMessageImportance.High”);
字符串倍数=string.Join(“,”,
filenameGroupings.Where(group=>group.Count()>1)。SelectMany(group=>group.Select(fileInfo=>fileInfo.FullName)).ToArray();
TrackBuildMessage(“重复测试项:+倍数,BuildMessageImportance.High”);
返回listOut.ToList();
}
}
}

您可以在“查找测试程序集”任务之后插入此项。

我仍在使用FindMatchingFiles活动,但我必须添加带有以下参数的分配活动:

测试组件 From-testAssemblies.Where(函数(o)不是o.Contains(“\obj\”).ToList()
我正在以这种方式筛选在“obj”文件夹中找到的所有测试程序集。

我遇到了这个问题,但发现不仅仅是包含重复项的bin和obj,我在不同的项目文件夹中出现了相同DLL的多个副本

Ludwo对
Assign
的回答几乎足以修复它,但对于我的情况,我需要一个更一般的
From
参数值。此VB按文件名对发现的文件路径进行分组,然后从每个组中选择第一个路径。当然,只有当且仅当每个文件名映射到一个逻辑DLL时,它才会工作:

testAssemblies.GroupBy(Function(a) New System.IO.FileInfo(a).Name).[Select](Function(g) g.First())

你说得对。testAssemblies集合由“查找测试程序集”活动填充。在此活动之后,我有foreach活动来记录testAssemblies集合的内容。若我使用**test.dll掩码,结果是正常的,但bin和obj文件夹中有重复的测试程序集。我试着用不同的面具来过滤,但似乎我用错了面具。testAssemblies集合始终为空。我可以在代码中过滤它作为一种解决方法…我尝试过它,但结果仍然是一样的。我将搜索掩码更改为“.\..\***\.Unittests.dll”。从其他生成中找到了其他测试程序集。然后