使用AsConfigured仍然能够在TFS中获得UnitTest结果

时间:2014-06-13 14:43:52

标签: unit-testing tfs mstest tfsbuild

所以当我使用输出位置“AsConfigred”使用tfs构建控制器构建项目时,我遇到了一个问题,它不会检测我的单元测试。让我提一下我的设置。

TFS 2013 Update 2,默认流程模板

以下是一些屏幕截图,可以帮助填写我无法输入的内容。我正在将我的构建复制到我们网络上的文件共享中,以便我们可以使用其他实用程序来使用输出。我不想使用“PerProject”或“SingleFolder”,因为它们搞乱了我们配置的文件结构(这两个都将运行测试)。所以我将文件复制到文件夹名称“SingleOutputFolder”,它是DropLocation的子项。我希望能够从drop文件夹运行或从bin文件夹运行我的每个测试(我不关心哪个)。但是它似乎没有检测到/运行任何测试。任何帮助将不胜感激。如果您需要任何其他信息,请与我们联系。

我尝试过使用*** test * .dll,Install \ SingleFolderOutput **。test.dll和$(TF_BUILD_DROPLOCATION)\ Install \ SingleFolderOutput * test * .dll

但我不确定哪些变量可用,并了解其执行范围在哪里。

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:9)

鉴于您使用构建输出位置设置为 AsConfigured ,您必须将测试源规范设置的默认值更改为允许构建在bin文件夹中查找测试库。这是一个例子。

如果单元测试库的完整路径是:

E:\Builds\7\<TFS Team Project>\<Build Definition>\src\<Unit Test Project>\bin\Release\*test*.dll

使用

..\src\*UnitTest*\bin\*\*test*.dll;

答案 1 :(得分:2)

MSDN论坛here上提出了这个问题。

MSDN论坛建议的解决方法

在接受的答案(截至6月20日上午8点)中建议的解决方法是指定测试项目的二进制文件夹的完整路径:例如:

C:\Builds\{agentId}\{teamProjectName}\{buildDefinitionName}\src\{solutionName}\{testProjectName}\bin*\Debug\*test*.dll*

真的应该显示为

{agentWorkingFolder}\src\{relativePathToTestProjectBinariesFolder}\*test*.dll

然而,由于以下原因,这种方法非常脆弱:

  1. 添加到解决方案中的任何新测试项目在将它们添加到构建定义的测试源列表之前都不会执行:
  2. 在以下任何情况下都会中断:
    • 构建定义已重命名
    • 修改了构建代理属性中的工作文件夹
    • 您有多个构建代理,并且与{id}中指定的代理不同的代理运行构建
  3. 改进的解决方法

    我的解决方法可以缓解#2中列出的问题(对#1无能为力)。

    在上面指定的路径中,替换初始部分:

    {agentWorkingFolder} 
    

    ..
    

    所以你有

    ..\src\{relativePathToTestProjectBinariesFolder}\*test*.dll
    

    这是有效的,因为内部工作目录显然是\ _saries \文件夹,它是\ src \文件夹的兄弟。导航到父文件夹(无论它是什么名称,我们都不关心)并返回到\ src \,然后指定测试项目二进制文件的路径就行了。

    注意:如果您有多个测试项目,则添加其他条目,用分号分隔:

    ..\src\{relativePathToTestProjectONEBinariesFolder}\*test*.dll;..\src\{relativePathToTestProjectTWOBinariesFolder}\*test*.dll;..\src\{relativePathToTestProjectTHREEBinariesFolder}\*test*.dll;
    

答案 2 :(得分:1)

我最终做的是添加一个post build事件,将所有test.dll复制到特定构建中的staging location文件夹中,该文件夹基本上等同于单个构建器构建的内容并执行此操作在每个测试项目上。

if "$(TeamBuildOutDir)" == "" (
echo "Building Interactively not in TFS"
) else (
echo "Building in TFS"
xcopy "$(TargetDir)*.*" "$(TeamBuildBinaries)\" /Y /E /S
)

构建def中的MSBUILD参数告诉它基本上放在TFS查找它们的文件夹中。

/p:TeamBuildBinaries="$(TF_BUILD_BINARIESDIRECTORY)"

保持默认的测试程序集文件规范:

**\*test*.dll

查看此链接以获取有关我使用的变量及其存在的相对路径的信息。

答案 3 :(得分:0)

另一种解决方案是反过来。

将所有文件保留在根目录中,以便所有内置功能都能正常工作。那里不仅仅是测试执行。静态代码分析,影响分析......等等。你必须为他们所有人定制一些东西。

而是使用pre-drop powershell脚本从根文件创建安装安排。

如果它是一个应用程序,那么您可以使用_ApplicationFolder Nuget包创建一个与Web应用程序相同的_PublishApplications文件夹。