【问题标题】:Code coverage using dotCover throws an error - FAKE F#MAKE使用 dotCover 的代码覆盖会引发错误 - FAKE F#MAKE
【发布时间】:2017-03-24 11:28:49
【问题描述】:

我正在尝试在 FAKE 中使用 DotCover,但它会引发一些错误,因为我是 FAKE 和 F# 的新手,我很难理解问题的根本原因。这是代码:

 #r "D:/FAKEProject/Fake/packages/FAKE/tools/FakeLib.dll"
    open Fake
    open Fake.DotCover
    let testDir = "D:/FAKEProject/Fake/test/"
    let filters = ""
    Target "Clean" (fun _ ->
        CleanDirs [testDir]
    )
    Target "TestCoverage" (fun _ ->
        !! ("D:/FAKEProject/Fake/UnitTest/UnitTest.dll")
            |> DotCoverNUnit
                (fun p -> { p with Output = testDir @@ "NUnitDotCover.snapshot"
                                   ToolPath = "D:/tools/dotCover/dotCover.exe"
                                   Filters = filters })                              
                (fun nunitOptions -> nunitOptions)
    )
    "Clean"
        ==> "TestCoverage"
    RunTargetOrDefault "TestCoverage"`

出现这个错误

System.Exception: Error running D:/tools/dotCover/dotCover.exe with exitcode -1
   at Fake.DotCover.buildParamsAndExecute@124-6.Invoke(String message) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 124
   at Fake.DotCover.buildParamsAndExecute[a](a parameters, FSharpFunc`2 buildArguments, String toolPath, String workingDir, Boolean failBuild) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 124
   at Fake.DotCover.DotCoverNUnit(FSharpFunc`2 setDotCoverParams, FSharpFunc`2 setNUnitParams, IEnumerable`1 assemblies) in C:\code\fake\src\app\FakeLib\DotCover.fs:line 190
   at FSI_0005.DotCover.clo@16-2.Invoke(Unit _arg2) in D:\FAKEProject\Fake\DotCover.fsx:line 17
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 492`

我无法理解为什么它在 C:\code\fake\src\app\fakelib\dotcover.fs 中搜索 它在寻找什么 dotcover.fs 如何解决这个问题,因为我遇到了这个错误,如果有人可以帮助我解决这个问题,那将非常有帮助。

谢谢

【问题讨论】:

    标签: f# f#-interactive f#-3.0 f#-data f#-fake


    【解决方案1】:

    神秘的C:\code\fake\src\app\FakeLib\DotCover.fs 行只是告诉您引发错误的源文件的文件名(和行号)。不是您的 系统上的文件名,而是您的FAKE.exe 文件所在系统上的文件名。换句话说,它只是告诉你异常是从哪里引发的。

    查看 FAKE 源代码,我看到第 124 行接近以下代码块的末尾:

    let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild =
        let args = buildArguments parameters
        trace (toolPath + " " + args)
        let result = ExecProcess (fun info ->  
                  info.FileName <- toolPath
                  info.WorkingDirectory <- getWorkingDir workingDir
                  info.Arguments <- args) TimeSpan.MaxValue
        let ExitCodeForFailedTests = -3
        if (result = ExitCodeForFailedTests && not failBuild) then 
            trace (sprintf "DotCover %s exited with errorcode %d" toolPath result)
        else if (result = ExitCodeForFailedTests && failBuild) then 
            failwithf "Failing tests, use ErrorLevel.DontFailBuild to ignore failing tests. Exited %s with errorcode %d" toolPath result
        else if (result <> 0) then 
            failwithf "Error running %s with exitcode %d" toolPath result
        else 
            trace (sprintf "DotCover exited successfully")
    

    failwithf 函数相当于 F# 中的“throw new Exception()”,但它允许您指定一条消息(使用 printfn 样式的格式代码,如 %s)来处理异常。所以在 F# 中没有什么神秘的事情发生,只是你的 D:/tools/dotCover/dotCover.exe 程序返回了一个 -1 的返回码。 -1 的返回码通常表示“一般错误”,因此这对找出原因没有多大帮助。

    您的下一个故障排除步骤是手动运行您的dotCover.exe 程序,并为其提供与 FAKE 相同的参数(不应该太难弄清楚,因为 FAKE 选项记录通常命名良好)和相同的输入。然后查看dotCover.exe 在失败之前打印出哪些错误消息(如果有)。

    【讨论】:

    • 我尝试使用 dotcover 和 nunit.console.exe 从控制台运行测试用例,然后忽略 1 个单元测试用例并正常工作并生成报告。它显示已分析的应用程序以代码 1 退出
    • 我添加了TargetExecutable = "D:/Project/tools/NUnit.Runners.2.6.3/nunit-console.exe",现在可以使用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多