我们在我们的产品上每晚运行自动化测试,最近从VS2015更改为VS2017,以构建我们的自动化测试和我们正在测试的软件。由于所有工具(VsDevCmd.bat,mstest.exe等)都位于VS2017中的不同路径中,因此我需要在测试运行器的配置文件中更改这些路径。因此,例如,对于VsDevCmd.bat,我们来自:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat
到
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat
现在我们用来运行测试类别的函数如下所示:
let private runTestsWithoutPublishing (testCategory,testContainers:String[],resultFilePath,testSettingPath) = ccr {
let stc =
testContainers
|>Array.map (fun tc -> sprintf "/testcontainer:\"%s\"" tc)
let tcontainers = String.Join(" ", stc)
let t1 =
sprintf "mstest.exe %s /category:\"%s\" /resultsfile:\"%s\" /testsettings:\"%s\""
tcontainers testCategory resultFilePath testSettingPath
let psi = new System.Diagnostics.ProcessStartInfo("cmd.exe","/k \""+VSDCPath+"\"")
psi.UseShellExecute <- false
psi.RedirectStandardOutput <- true
psi.RedirectStandardError <- true
psi.RedirectStandardInput <- true
psi.CreateNoWindow <- false
let p = System.Diagnostics.Process.Start(psi)
let output = new System.Text.StringBuilder()
let error = new System.Text.StringBuilder()
p.OutputDataReceived.Add(fun args ->
output.Append(args.Data)|> ignore
output.Append("\r\n")|> ignore)
p.ErrorDataReceived.Add(fun args -> error.Append(args.Data) |> ignore)
p.BeginErrorReadLine()
p.BeginOutputReadLine()
p.StandardInput.WriteLine t1
p.StandardInput.WriteLine "Exit"
p.WaitForExit()
return { exitCode = p.ExitCode; stdout = output.ToString(); stderr = error.ToString() }
}
VSDCPath
是上述两条路径之一。
自从上面提到的路径更改后我看到的问题是,我现在在运行此代码时看到以下错误:
'C:\Program' is not recognized as an internal or external command,operable program or batch file.'mstest.exe' is not recognized as an internal or external command,operable program or batch file.
因此,自从我更改路径后,解析似乎已经破解,我不明白为什么VSDCPath
被双引号\"
包围。此外,两个路径中都有空格,但只有第一个路径使用上述代码。
我错过了什么吗?