NUnit ошибка доступа запрещена в dotcover.exe - PullRequest
0 голосов
/ 30 марта 2020

Я пишу сценарий 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, но ошибка все еще сохраняется. Эта проблема связана с правами или что-то? любой способ избавиться от этого? и после этого исполнение не останавливается ни провал, ни прохождение.

1 Ответ

0 голосов
/ 01 апреля 2020

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

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

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

Оператор вызова &

Почему:

Используется для обработки строки как команды SINGLE. Полезно для работы с пробелами. В 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
...