NUnit ошибка отказа в доступе в dotcover.exe

Я пишу сценарий PowerShell для dotCover для создания отчета о покрытии с помощью NUnit-console.exe. После запуска сценария -

$testRunner="C:\Program Files (x86)\NUnit 2.6.2\bin\nunit-console.exe"
$testContainers="path/to/test1.dll","path/to/test2.dll"
$dotcover="D:\JetBrains.dotCover.CommandLineTools.2019.3.4\dotcover.exe"

foreach($test in $testContainers)
{
$testAssembly=Get-Item $test
$testName= $testAssembly.BaseName
&$dotcover cover /TargetExecutable=$testRunner /TargetArguments=$test /Output="D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\$testName.dcvr"
}

$testReports=$testContainer|%{
$testAssembly=Get-Item $test
$name= $testAssembly.BaseName
return ("D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\{0}.dcvr" -f $name)
}

$testReportArguments=[String]::Join(";",$testReports)
&$dotcover merge /Source="$testReportArguments" /Output="D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.dcvr" /ReportType="DCVR"


&$dotcover report /Source="D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.dcvr" /Output="D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.html" /ReportType="HTML"

Выдает следующую ошибку-

Unhandled Exception:
System.UnauthorizedAccessException: Access to the path 'C:\Program Files (x86)\NUnit 2.6.2\bin\TestResult.xml' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String 
msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   at System.IO.StreamWriter..ctor(String path)
   at NUnit.ConsoleRunner.ConsoleUi.Execute(ConsoleOptions options)
   at NUnit.ConsoleRunner.Runner.Main(String[] args)

Несмотря на то, что этот файл TestResult.xml находится не в том месте,

C:\Program Files (x86)\NUnit 2.6.2\doc\files\TestResult.xml

но я скопировал этот файл и поместил его в папку bin, но ошибка все равно сохраняется. Эта проблема связана с правами или что-то в этом роде? любой способ избавиться от этого? и после этого казнь останавливается, не проваливается и не проходит.


person NetSurfer    schedule 30.03.2020    source источник
comment
Вы нигде не вызываете этот XML-файл напрямую, и не PowerShell знает, где он находится, это будет dorCover (о котором я читал, но никогда не использовал). Кроме того, при использовании внешних инструментов важны кавычки и интервалы в отношении того, как передаются аргументы. код скученности может быть проблемой. См. --- social.technet.microsoft. com/wiki/contents/articles/ --- blogs.technet.microsoft.com/josebda/2012/03/03/   -  person postanote    schedule 31.03.2020
comment
@postanote, не могли бы вы показать мне изменения в коде?   -  person NetSurfer    schedule 01.04.2020


Ответы (1)


Каждый раз, когда вы видите «Отказано в доступе», тогда да, это проблема с разрешениями / ACL. Значит, вам нужно это проверить.

Честно говоря, я бы предложил добавить эти пути «exe» в системный путь Windows или путь к среде PowerShell. Однако, взяв то, что вы показали до сих пор, по ссылке, которую я включил в свой комментарий:

PowerShell: запуск исполняемых файлов

  1. Оператор вызова и

Почему:

Используется для обработки строки как ОДНОЙ команды. Полезно для работы с пробелами. В PowerShell V2.0, если вы запускаете 7z.exe (7-Zip.exe) или другую команду, которая начинается с цифры, вы должны использовать оператор вызова команды &. Парсер PowerShell V3.0 делает это теперь умнее, в этом случае вам больше не нужен &.

Подробности:

Запускает команду, сценарий или блок сценария. Оператор вызова, также известный как «оператор вызова», позволяет запускать команды, хранящиеся в переменных и представленные строками. Поскольку оператор вызова не анализирует команду, он не может интерпретировать параметры команды.

# Example:
& 'C:\Program Files\Windows Media Player\wmplayer.exe' "c:\videos\my home video.avi"  /fullscreen

Ситуация может усложниться, когда у внешней команды много параметров или в аргументах или путях есть пробелы!

С пробелами приходится вставлять кавычки и результат не всегда понятен!

В этом случае лучше все разделить так:

$CMD  =  'SuperApp.exe'
$arg1 =  'filename1'
$arg2 =  '-someswitch'
$arg3 =  'C:\documents and settings\user\desktop\some other file.txt'
$arg4 =  '-yetanotherswitch'
& $CMD $arg1 $arg2 $arg3 $arg4

# or same like that:
$AllArgs =  @('filename1',  '-someswitch', 'C:\documents and settings\user\desktop\some other file.txt', '-yetanotherswitch')
& 'SuperApp.exe' $AllArgs

Итак, это изменение должно заставить вас двигаться. Опять же, я не использую этот инструмент, поэтому нет возможности проверить, и поэтому вам может потребоваться настройка.

Смотрите также:

Реализация DotCover из Powershell

$testRunner     = 'C:\Program Files (x86)\NUnit 2.6.2\bin\nunit-console.exe'
$testContainers = 'path/to/test1.dll','path/to/test2.dll'
$dotcover       = 'D:\JetBrains.dotCover.CommandLineTools.2019.3.4\dotcover.exe'

foreach($test in $testContainers)
{
    $testAssembly = Get-Item $test
    $testName     = $testAssembly.BaseName

    $arg1 = 'cover'
    $arg2 = '/TargetExecutable = $testRunner'
    $arg3 = '/TargetArguments = $test'
    $arg4 = '/TargetExecutable = $testRunner'
    $arg5 = '/Output = "D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\$testName.dcvr"'
    & $dotcover $arg1 $arg2 $arg3 $arg4 $arg5
}

$testReports  = $testContainer | 
%{
    $testAssembly = Get-Item $test
    $name = $testAssembly.BaseName
    return ('D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\{0}.dcvr' -f $name)
}

$testReportArguments = [String]::Join(';',$testReports)

$arg1 = 'merge'
$arg2 = '/Source = $testReportArguments'
$arg3 = '/Output = "D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.dcvr"'
$arg4 = '/ReportType = "DCVR"'
& $dotcover $arg1 $arg2 $arg3 $arg4


$arg1 = 'report'
$arg2 = '/Source = "D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.dcvr"'
$arg3 = '/Output = "D:\JetBrains.dotCover.CommandLineTools.2019.3.4\TestReport\mergedReport.html"'
$arg4 = '/ReportType="HTML"'
& $dotcover $arg1 $arg2 $arg3 $arg4
person postanote    schedule 01.04.2020