首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTest MacOS错误:未找到可执行的测试

CTest MacOS错误:未找到可执行的测试
EN

Stack Overflow用户
提问于 2020-07-28 10:08:28
回答 1查看 593关注 0票数 7

我正在做一个CMake项目。对于CI,我已经决定使用Azure管道。然而,在测试阶段,我在MacOS上面临一个小问题。问题是MacOS无法找到测试可执行文件,即使它在那里也是如此。

早些时候,我的项目建设得不太好。但是现在,除了MacOS上的小故障之外,整个管道成功运行(多亏了Stack溢出社区)。我已经更新了我的问题,现在它告诉了问题是什么,我如何解决它,以便它可能是有益于其他像我这样的人,谁是新的世界的CI。

编辑1

早些时候,我的CMake任务没有触发构建过程。这是因为我没有向CMake提供任何命令行参数。我所做的就是:

代码语言:javascript
复制
- task: CMake@1
  displayName: Generate CMake Cache
  inputs:
    workingDirectory: build

我假设CMake任务会自动驱动构建过程,因为在文档中并没有明确说明该任务的实际操作。这除了打印CMake用法之外,什么也没有做。然后,我发现我们必须使用适当的命令行参数两次运行CMake任务(一次用于项目配置,然后用于实际构建)。

编辑2

这是我更新的AzurePipelines.yml文件

Azure管道CI

代码语言:javascript
复制
stages:
- stage: Build
  displayName: Build

  jobs:
  - job: RunCMakeTask
    displayName: Run CMake Task

    strategy:
      matrix:
        LinuxDebug:
          OS: 'Linux'
          imageName: 'ubuntu-latest'
          BuildConfiguration: 'Debug'
        LinuxRelease:
          OS: 'Linux'
          imageName: 'ubuntu-latest'
          BuildConfiguration: 'RelWithDebInfo'
        MacOSDebug:
          OS: 'MacOS'
          imageName: 'macos-latest'
          BuildConfiguration: 'Debug'
        MacOSRelease:
          OS: 'MacOS'
          imageName: 'macos-latest'
          BuildConfiguration: 'RelWithDebInfo'
        WindowsDebug:
          OS: 'Windows'
          imageName: 'windows-latest'
          BuildConfiguration: 'Debug'
        WindowsRelease:
          OS: 'Windows'
          imageName: 'windows-latest'
          BuildConfiguration: 'RelWithDebInfo'

    pool:
      vmImage: $(imageName)

    steps:
    - script: mkdir $(BuildConfiguration)
      displayName: Create Build Directory
      workingDirectory: $(Build.SourcesDirectory)
    - task: CMake@1
      displayName: Generate CMake Cache
      inputs:
        workingDirectory: $(BuildConfiguration)
        cmakeArgs: '-DCMAKE_BUILD_TYPE=$(BuildConfiguration) ..'
    - task: CMake@1
      displayName: Run Build Process
      inputs:
        workingDirectory: $(BuildConfiguration)
        cmakeArgs: '--build . --config $(BuildConfiguration)'
    - task: PublishPipelineArtifact@1
      displayName: Publish Build Artifact
      inputs:
        targetPath: $(BuildConfiguration)
        artifactName: '$(OS)$(BuildConfiguration)'
    
- stage: Test   
  displayName: Test
  dependsOn: Build

  jobs:
  - job: RunCTestOnWindows
    displayName: Run CTest on Windows

    variables:
      OS: Windows

    strategy:
      matrix:
        Debug:
          BuildConfiguration: 'Debug'
        Release:
          BuildConfiguration: 'RelWithDebInfo'

    pool:
      vmImage: 'windows-latest'

    steps:
    - task: DownloadPipelineArtifact@2
      displayName: Download Build Artifact
      inputs:
        artifact: '$(OS)$(BuildConfiguration)'
        path: $(Build.SourcesDirectory)/$(BuildConfiguration)
    - script: ctest -C $(BuildConfiguration) --output-on-failure
      workingDirectory: $(BuildConfiguration)
      
  - job: RunCTestOnUnixBasedSystems
    displayName: Run CTest on Unix Based Systems

    strategy:
      matrix:
        LinuxDebug:
          OS: 'Linux'
          imageName: 'ubuntu-latest'
          BuildConfiguration: 'Debug'
        LinuxRelease:
          OS: 'Linux'
          imageName: 'ubuntu-latest'
          BuildConfiguration: 'RelWithDebInfo'
        MacOSDebug:
          OS: 'MacOS'
          imageName: 'macos-latest'
          BuildConfiguration: 'Debug'
        MacOSRelease:
          OS: 'MacOS'
          imageName: 'macos-latest'
          BuildConfiguration: 'RelWithDebInfo'

    steps:
    - task: DownloadPipelineArtifact@2
      displayName: Download Build Artifact
      inputs:
        artifact: '$(OS)$(BuildConfiguration)'
        path: $(Build.SourcesDirectory)/$(BuildConfiguration)
    - script: find $(BuildConfiguration)/Tests -type f -name "Test*" ! -name "*.*" ! -exec chmod u+rx {} \;
      displayName: Change File Permissions
    - script: ctest -C $(BuildConfiguration) --output-on-failure
      workingDirectory: $(BuildConfiguration)

该管道在Windows和Linux上运行良好,但我在MacOS上面临一个小问题。在MacOS上,即使在测试可执行文件存在的情况下,ctest也无法找到它。(如果我的管道或CMakeLists.txt文件有任何问题,它也应该在Windows和Linux上失败)

编辑3

在MacOS的测试阶段,我得到了错误:

测试项目/home/vst/work/1/s/Debug 1: /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations无法在以下位置找到可执行的StringOperations_CaseIgnore : /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations /Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations /User/runner/work/1/s/Debug/ Test /字符串操作/调试/测试字符串操作Debug//Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Debug//Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations调试/用户/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Debug/Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations 1/1测试#1: StringOperations_CaseIgnore ......***Not运行0.00秒 0%通过测试,1次测试失败 测试总时间(实)= 0.00秒 以下测试失败:1- StringOperations_CaseIgnore (未运行)在运行CTest时无法找到可执行文件:CTest错误

编辑4

我试图通过以下方法检查测试可执行文件是否实际存在:

代码语言:javascript
复制
ls -l Debug/Tests/StringOperations

这是输出:

代码语言:javascript
复制
drwxr-xr-x 3 vsts docker    4096 Aug  6 15:05 CMakeFiles
-rw-r--r-- 1 vsts docker    1208 Aug  6 15:05 cmake_install.cmake
-rw-r--r-- 1 vsts docker     642 Aug  6 15:05 CTestTestfile.cmake
-rw-r--r-- 1 vsts docker    9838 Aug  6 15:05 Makefile
-rwxr--r-- 1 vsts docker 1715072 Aug  6 15:05 TestStringOperations

这证实了测试可执行文件(TestStringOperations)在Windows和Linux中相同的位置,但进程仍然失败。

如果您需要这个可执行文件,下面是它的CMakeLists.txt:

代码语言:javascript
复制
Set(SRC StringOperations.cpp)

Add_Executable(TestStringOperations ${SRC})

Target_Include_Directories(TestStringOperations PUBLIC
                           ${HEADER_PATH}/StringOperations
)

Target_Link_Libraries(TestStringOperations
                      PRIVATE ${GTEST_LIBS}
                      PRIVATE StringOperations
)

Add_Test(NAME StringOperations_CaseIgnore COMMAND TestStringOperations)

我试着在Stack溢出和其他一些网站上寻求这个问题的帮助,但是他们的解决方案并没有让我受益。

例如:CTest找不到可执行文件CMake:如何指定ctest应该查找可执行文件的目录?

如果您需要更多信息,这里是我在GitHub上的项目。您还可以参考dev.azure.com上的管道日志。

你能帮我解决这个问题吗?任何关于这个文件的全面实施的建议也是值得欢迎的。

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 15:06:03

在构建之后尝试运行一个发布管道工件任务。正如注释中所回避的那样,这将发布您的构建内容,并允许跨阶段共享。

完成此操作之后,您还可以将其视为管道UI中发布的工件。

代码语言:javascript
复制
# Publish pipeline artifacts
# Publish (upload) a file or directory as a named artifact for the current run
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Pipeline.Workspace)' 
    artifactName: # 'drop'

另外,在阶段结束时可以完成的另一个肠道检查是包含一个powershell脚本,以查看您正在工作的目录的内容:

代码语言:javascript
复制
-powershell: Get-ChildItem -Path 'Insert root path' -recurse
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63131708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档