From 9e7a20b01bb1184f539307b43519faf2c5222376 Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Fri, 17 Jul 2020 18:24:30 +0200 Subject: [PATCH 1/7] fix formatting for Nunit parameterrized tests --- src/functions/TestResults.ps1 | 47 ++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index 6757d0804..19e830b66 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -594,32 +594,44 @@ function Write-NUnitTestCaseElement($TestResult, [System.Xml.XmlWriter] $XmlWrit function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlWriter, [string] $ParameterizedSuiteName, [string] $Path) { $testName = $TestResult.Path -join '.' + foreach ($testParameterName in $TestResult.Data.Keys){ + $matchString = [regex]::Escape("<$testParameterName>") + if ($testName -match $matchString){ + $testName = $testName -replace $matchString, [string]$TestResult.Data.$testParameterName + $paramsUsedInTestName = $true + } + } + # todo: this comparison would fail if the test name would contain $(Get-Date) or something similar that changes all the time if ($testName -eq $ParameterizedSuiteName) { $paramString = '' if ($null -ne $TestResult.Data) { - $params = @( - foreach ($value in $TestResult.Data.Values) { - if ($null -eq $value) { - 'null' - } - elseif ($value -is [string]) { - '"{0}"' -f $value - } - else { - #do not use .ToString() it uses the current culture settings - #and we need to use en-US culture, which [string] or .ToString([Globalization.CultureInfo]'en-us') uses - [string]$value + $paramsUsedInTestName =$false + + if (-not $paramsUsedInTestName) { + $params = @( + foreach ($value in $TestResult.Data.Values) { + if ($null -eq $value) { + 'null' + } + elseif ($value -is [string]) { + '"{0}"' -f $value + } + else { + #do not use .ToString() it uses the current culture settings + #and we need to use en-US culture, which [string] or .ToString([Globalization.CultureInfo]'en-us') uses + [string]$value + } } - } - ) + ) - $paramString = "($($params -join ','))" + $paramString = "($($params -join ','))" + + $testName = "$testName$paramString" + } } } - $testName = "$testName$paramString" - $XmlWriter.WriteAttributeString('description', $TestResult.Name) $XmlWriter.WriteAttributeString('name', $testName) @@ -719,6 +731,7 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW } } } + function Get-RunTimeEnvironment() { # based on what we found during startup, use the appropriate cmdlet $computerName = $env:ComputerName From 486501fc5694ab58a5a12a074f0637432c036086 Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Fri, 17 Jul 2020 20:37:55 +0200 Subject: [PATCH 2/7] fix tests, adjust access to hashtable --- src/functions/TestResults.ps1 | 2 +- tst/Pester.RSpec.Nunit.TestResults.ts.ps1 | 50 ++++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index 19e830b66..6d7b3871c 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -597,7 +597,7 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW foreach ($testParameterName in $TestResult.Data.Keys){ $matchString = [regex]::Escape("<$testParameterName>") if ($testName -match $matchString){ - $testName = $testName -replace $matchString, [string]$TestResult.Data.$testParameterName + $testName = $testName -replace $matchString, [string]$TestResult.Data[$testParameterName] $paramsUsedInTestName = $true } } diff --git a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 index cceb10c7f..dc449a7cf 100644 --- a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 +++ b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 @@ -268,7 +268,7 @@ i -PassThru:$PassThru { t 'should write parameterized test results correctly' { $sb = { Describe "Mocked Describe" { - It "Parameterized Testcase " -TestCases @( + It "Parameterized Testcase" -TestCases @( @{ Value = 1 } [ordered] @{ Value = 2; StringParameter = "two"; NullParameter = $null; NumberParameter = -42.67 } ) { @@ -281,8 +281,8 @@ i -PassThru:$PassThru { $xmlResult = $r | ConvertTo-NUnitReport $xmlTestSuite = $xmlResult.'test-results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite' - $xmlTestSuite.name | Verify-Equal 'Mocked Describe.Parameterized Testcase ' - $xmlTestSuite.description | Verify-Equal 'Parameterized Testcase ' + $xmlTestSuite.name | Verify-Equal 'Mocked Describe.Parameterized Testcase' + $xmlTestSuite.description | Verify-Equal 'Parameterized Testcase' $xmlTestSuite.type | Verify-Equal 'ParameterizedTest' $xmlTestSuite.result | Verify-Equal 'Failure' $xmlTestSuite.success | Verify-Equal 'False' @@ -293,10 +293,50 @@ i -PassThru:$PassThru { $testCase1 = $xmlTestSuite.results.'test-case'[0] $testCase2 = $xmlTestSuite.results.'test-case'[1] - $testCase1.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase (1)' + $testCase1.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase(1)' $testCase1.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration - $testCase2.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase (2,"two",null,-42.67)' + $testCase2.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase(2,"two",null,-42.67)' + $testCase2.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration + + # verify against schema + $schemaPath = (Get-Module -Name Pester).Path | Split-Path | Join-Path -ChildPath "nunit_schema_2.5.xsd" + $null = $xmlResult.Schemas.Add($null, $schemaPath) + $xmlResult.Validate( { throw $args[1].Exception }) + } + + t 'should write parameterized test results correctly if tags are used' { + $sb = { + Describe "Mocked Describe" { + It "Parameterized Testcase Value: " -TestCases @( + @{ Value = 1 } + [ordered] @{ Value = 2; StringParameter = "two"; NullParameter = $null; NumberParameter = -42.67 } + ) { + param ($Value) + $Value | Should -Be 1 + } + } + } + $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb; PassThru = $true }; Output = @{ Verbosity = 'None' } }) + + $xmlResult = $r | ConvertTo-NUnitReport + $xmlTestSuite = $xmlResult.'test-results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite' + $xmlTestSuite.name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: ' + $xmlTestSuite.description | Verify-Equal 'Parameterized Testcase Value: ' + $xmlTestSuite.type | Verify-Equal 'ParameterizedTest' + $xmlTestSuite.result | Verify-Equal 'Failure' + $xmlTestSuite.success | Verify-Equal 'False' + $xmlTestSuite.time | Verify-XmlTime ( + $r.Containers[0].Blocks[0].Tests[0].Duration + + $r.Containers[0].Blocks[0].Tests[1].Duration) + + $testCase1 = $xmlTestSuite.results.'test-case'[0] + $testCase2 = $xmlTestSuite.results.'test-case'[1] + + $testCase1.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 1' + $testCase1.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration + + $testCase2.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 2' $testCase2.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration # verify against schema From dd4bc6d6c7383b0cfd29b9c140346244d55d50fc Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Mon, 20 Jul 2020 16:37:45 +0200 Subject: [PATCH 3/7] move name generation to invoke-testitem this will allow usage at other locations aswell --- src/Pester.Runtime.psm1 | 2 ++ src/csharp/Pester/Test.cs | 1 + src/functions/TestResults.ps1 | 12 ++---------- tst/Pester.RSpec.Nunit.TestResults.ts.ps1 | 20 +++++++++++--------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Pester.Runtime.psm1 b/src/Pester.Runtime.psm1 index 4169394c8..32fd95e84 100644 --- a/src/Pester.Runtime.psm1 +++ b/src/Pester.Runtime.psm1 @@ -448,6 +448,8 @@ function Invoke-TestItem { $Test.ExpandedName = & $state.ExpandName -Name $Test.Name -Data $Test.Data + $test.ExpandedPath = & $state.ExpandName -Name ($Test.Path -join '.') -Data $Test.Data + $block = $Test.Block if ($PesterPreference.Debug.WriteDebugMessages.Value) { Write-PesterDebugMessage -Scope Runtime "Running test '$($Test.Name)'." diff --git a/src/csharp/Pester/Test.cs b/src/csharp/Pester/Test.cs index 9ba0b7e5f..db38f979e 100644 --- a/src/csharp/Pester/Test.cs +++ b/src/csharp/Pester/Test.cs @@ -30,6 +30,7 @@ public Test() public List Path { get; set; } public IDictionary Data { get; set; } public string ExpandedName { get; set; } + public string ExpandedPath { get; set; } public string Result { get; set; } public List ErrorRecord { get; set; } diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index 6d7b3871c..df3924f4d 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -592,15 +592,7 @@ function Write-NUnitTestCaseElement($TestResult, [System.Xml.XmlWriter] $XmlWrit } function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlWriter, [string] $ParameterizedSuiteName, [string] $Path) { - $testName = $TestResult.Path -join '.' - - foreach ($testParameterName in $TestResult.Data.Keys){ - $matchString = [regex]::Escape("<$testParameterName>") - if ($testName -match $matchString){ - $testName = $testName -replace $matchString, [string]$TestResult.Data[$testParameterName] - $paramsUsedInTestName = $true - } - } + $testName = $TestResult.ExpandedPath # todo: this comparison would fail if the test name would contain $(Get-Date) or something similar that changes all the time if ($testName -eq $ParameterizedSuiteName) { @@ -632,7 +624,7 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW } } - $XmlWriter.WriteAttributeString('description', $TestResult.Name) + $XmlWriter.WriteAttributeString('description', $TestResult.ExpandedName) $XmlWriter.WriteAttributeString('name', $testName) $XmlWriter.WriteAttributeString('time', (Convert-TimeSpan $TestResult.Duration)) diff --git a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 index dc449a7cf..9f8f649d5 100644 --- a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 +++ b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 @@ -265,7 +265,7 @@ i -PassThru:$PassThru { } b 'Exporting Parameterized Tests (Newer format)' { - t 'should write parameterized test results correctly' { + t 'should write parameterized test results without tags expanded with parameter set values' { $sb = { Describe "Mocked Describe" { It "Parameterized Testcase" -TestCases @( @@ -293,11 +293,11 @@ i -PassThru:$PassThru { $testCase1 = $xmlTestSuite.results.'test-case'[0] $testCase2 = $xmlTestSuite.results.'test-case'[1] - $testCase1.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase(1)' - $testCase1.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration + $testCase1.name | Verify-Equal 'Mocked Describe.Parameterized Testcase(1)' + $testCase1.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration - $testCase2.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase(2,"two",null,-42.67)' - $testCase2.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration + $testCase2.name | Verify-Equal 'Mocked Describe.Parameterized Testcase(2,"two",null,-42.67)' + $testCase2.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration # verify against schema $schemaPath = (Get-Module -Name Pester).Path | Split-Path | Join-Path -ChildPath "nunit_schema_2.5.xsd" @@ -333,11 +333,13 @@ i -PassThru:$PassThru { $testCase1 = $xmlTestSuite.results.'test-case'[0] $testCase2 = $xmlTestSuite.results.'test-case'[1] - $testCase1.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 1' - $testCase1.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration + $testCase1.name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 1' + $testCase1.description | Verify-Equal 'Parameterized Testcase Value: 1' + $testCase1.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration - $testCase2.Name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 2' - $testCase2.Time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration + $testCase2.name | Verify-Equal 'Mocked Describe.Parameterized Testcase Value: 2' + $testCase2.description | Verify-Equal 'Parameterized Testcase Value: 2' + $testCase2.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration # verify against schema $schemaPath = (Get-Module -Name Pester).Path | Split-Path | Join-Path -ChildPath "nunit_schema_2.5.xsd" From be36f15a771c7ffc40a7f1b4d68ff75312b4773a Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Mon, 20 Jul 2020 21:43:12 +0200 Subject: [PATCH 4/7] push with one less newline to re-trigger build --- src/functions/TestResults.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index df3924f4d..7ee5fd7c6 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -618,7 +618,6 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW ) $paramString = "($($params -join ','))" - $testName = "$testName$paramString" } } From 833ca9f66d81248eb729b9bf6a1c6edf2b74f6ef Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Mon, 20 Jul 2020 22:01:59 +0200 Subject: [PATCH 5/7] make output.ps1 also use the same variable, use $test.block.path to add parent path --- src/Pester.Runtime.psm1 | 2 +- src/functions/Output.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pester.Runtime.psm1 b/src/Pester.Runtime.psm1 index 32fd95e84..9eba34c85 100644 --- a/src/Pester.Runtime.psm1 +++ b/src/Pester.Runtime.psm1 @@ -448,7 +448,7 @@ function Invoke-TestItem { $Test.ExpandedName = & $state.ExpandName -Name $Test.Name -Data $Test.Data - $test.ExpandedPath = & $state.ExpandName -Name ($Test.Path -join '.') -Data $Test.Data + $test.ExpandedPath = "$($Test.Block.Path -join '.').$($Test.ExpandedName)" $block = $Test.Block if ($PesterPreference.Debug.WriteDebugMessages.Value) { diff --git a/src/functions/Output.ps1 b/src/functions/Output.ps1 index d43bd2e17..f1c3cb966 100644 --- a/src/functions/Output.ps1 +++ b/src/functions/Output.ps1 @@ -574,7 +574,7 @@ function Get-WriteScreenPlugin ($Verbosity) { $level = 0 $margin = '' $error_margin = $ReportStrings.Margin - $out = "$($_test.Block.Path -join '.').$($_test.ExpandedName)" + $out = $_test.ExpandedPath } else { throw "Unsupported level out output '$($PesterPreference.Output.Verbosity.Value)'" From 496956110d3a451b579bebaceac53a0102a8901a Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Mon, 27 Jul 2020 10:37:15 +0200 Subject: [PATCH 6/7] initial draft, tests still need to be written --- src/functions/TestResults.ps1 | 63 +++++++++++------------ tst/Pester.RSpec.Nunit.TestResults.ts.ps1 | 40 -------------- 2 files changed, 30 insertions(+), 73 deletions(-) diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index 7ee5fd7c6..0bd020804 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -592,44 +592,14 @@ function Write-NUnitTestCaseElement($TestResult, [System.Xml.XmlWriter] $XmlWrit } function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlWriter, [string] $ParameterizedSuiteName, [string] $Path) { - $testName = $TestResult.ExpandedPath - - # todo: this comparison would fail if the test name would contain $(Get-Date) or something similar that changes all the time - if ($testName -eq $ParameterizedSuiteName) { - $paramString = '' - if ($null -ne $TestResult.Data) { - $paramsUsedInTestName =$false - - if (-not $paramsUsedInTestName) { - $params = @( - foreach ($value in $TestResult.Data.Values) { - if ($null -eq $value) { - 'null' - } - elseif ($value -is [string]) { - '"{0}"' -f $value - } - else { - #do not use .ToString() it uses the current culture settings - #and we need to use en-US culture, which [string] or .ToString([Globalization.CultureInfo]'en-us') uses - [string]$value - } - } - ) - - $paramString = "($($params -join ','))" - $testName = "$testName$paramString" - } - } - } - $XmlWriter.WriteAttributeString('description', $TestResult.ExpandedName) - - $XmlWriter.WriteAttributeString('name', $testName) + $XmlWriter.WriteAttributeString('name', $TestResult.ExpandedPath) $XmlWriter.WriteAttributeString('time', (Convert-TimeSpan $TestResult.Duration)) $XmlWriter.WriteAttributeString('asserts', '0') $XmlWriter.WriteAttributeString('success', "Passed" -eq $TestResult.Result) + Write-NUnitTestCaseParameterElement + switch ($TestResult.Result) { Passed { $XmlWriter.WriteAttributeString('result', 'Success') @@ -723,6 +693,33 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW } } +function Write-NUnitTestCaseParameters ($TestResult, [System.Xml.XmlWriter] $XmlWriter) { + if($TestResult.Parameters) { + $XmlWriter.WriteStartElement('properties') + $TestResult.Parameters.GetEnumerator() | ForEach-Object -Process { + $XmlWriter.WriteStartElement("property") + $XmlWriter.WriteAttributeString("name",$_.Name) + $value = $_.Value + $XmlWriter.WriteAttributeString( + "value", + ( + if ($null -eq $value) { + 'null' + } elseif ($value.GetType() -match 'String|Int|Boolean|Double|Float|Decimal'){ + [string] $_.Value + } elseif ($value.GetType() -match 'System.DateTime'){ + $value.ToString('u') + } else { + $_.Value | Out-String + } + ) + ) + $XmlWriter.WriteEndElement() + } + $XmlWriter.WriteEndElement() + } +} + function Get-RunTimeEnvironment() { # based on what we found during startup, use the appropriate cmdlet $computerName = $env:ComputerName diff --git a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 index 9f8f649d5..377c33d5b 100644 --- a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 +++ b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 @@ -265,46 +265,6 @@ i -PassThru:$PassThru { } b 'Exporting Parameterized Tests (Newer format)' { - t 'should write parameterized test results without tags expanded with parameter set values' { - $sb = { - Describe "Mocked Describe" { - It "Parameterized Testcase" -TestCases @( - @{ Value = 1 } - [ordered] @{ Value = 2; StringParameter = "two"; NullParameter = $null; NumberParameter = -42.67 } - ) { - param ($Value) - $Value | Should -Be 1 - } - } - } - $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb; PassThru = $true }; Output = @{ Verbosity = 'None' } }) - - $xmlResult = $r | ConvertTo-NUnitReport - $xmlTestSuite = $xmlResult.'test-results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite' - $xmlTestSuite.name | Verify-Equal 'Mocked Describe.Parameterized Testcase' - $xmlTestSuite.description | Verify-Equal 'Parameterized Testcase' - $xmlTestSuite.type | Verify-Equal 'ParameterizedTest' - $xmlTestSuite.result | Verify-Equal 'Failure' - $xmlTestSuite.success | Verify-Equal 'False' - $xmlTestSuite.time | Verify-XmlTime ( - $r.Containers[0].Blocks[0].Tests[0].Duration + - $r.Containers[0].Blocks[0].Tests[1].Duration) - - $testCase1 = $xmlTestSuite.results.'test-case'[0] - $testCase2 = $xmlTestSuite.results.'test-case'[1] - - $testCase1.name | Verify-Equal 'Mocked Describe.Parameterized Testcase(1)' - $testCase1.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[0].Duration - - $testCase2.name | Verify-Equal 'Mocked Describe.Parameterized Testcase(2,"two",null,-42.67)' - $testCase2.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration - - # verify against schema - $schemaPath = (Get-Module -Name Pester).Path | Split-Path | Join-Path -ChildPath "nunit_schema_2.5.xsd" - $null = $xmlResult.Schemas.Add($null, $schemaPath) - $xmlResult.Validate( { throw $args[1].Exception }) - } - t 'should write parameterized test results correctly if tags are used' { $sb = { Describe "Mocked Describe" { From 25659b998a1c851487fe101bacb365b831bc3083 Mon Sep 17 00:00:00 2001 From: Alexander Buit Date: Mon, 27 Jul 2020 23:05:48 +0200 Subject: [PATCH 7/7] adding parameters properly to nunit output, tests successfull --- src/functions/TestResults.ps1 | 42 +++++++++++++---------- tst/Pester.RSpec.Nunit.TestResults.ts.ps1 | 15 ++++++++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/functions/TestResults.ps1 b/src/functions/TestResults.ps1 index 0bd020804..bb9e2de5d 100644 --- a/src/functions/TestResults.ps1 +++ b/src/functions/TestResults.ps1 @@ -598,13 +598,12 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW $XmlWriter.WriteAttributeString('asserts', '0') $XmlWriter.WriteAttributeString('success', "Passed" -eq $TestResult.Result) - Write-NUnitTestCaseParameterElement - switch ($TestResult.Result) { Passed { $XmlWriter.WriteAttributeString('result', 'Success') $XmlWriter.WriteAttributeString('executed', 'True') + Write-NUnitTestCaseParameters -TestResult $TestResult -XmlWriter $XmlWriter break } @@ -612,6 +611,8 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW $XmlWriter.WriteAttributeString('result', 'Ignored') $XmlWriter.WriteAttributeString('executed', 'False') + Write-NUnitTestCaseParameters -TestResult $TestResult -XmlWriter $XmlWriter + if ($TestResult.FailureMessage) { $XmlWriter.WriteStartElement('reason') $xmlWriter.WriteElementString('message', $TestResult.FailureMessage) @@ -625,6 +626,8 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW $XmlWriter.WriteAttributeString('result', 'Inconclusive') $XmlWriter.WriteAttributeString('executed', 'True') + Write-NUnitTestCaseParameters -TestResult $TestResult -XmlWriter $XmlWriter + if ($TestResult.FailureMessage) { $XmlWriter.WriteStartElement('reason') $xmlWriter.WriteElementString('message', $TestResult.FailureMessage) @@ -638,6 +641,8 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW $XmlWriter.WriteAttributeString('result', 'Inconclusive') $XmlWriter.WriteAttributeString('executed', 'True') + Write-NUnitTestCaseParameters -TestResult $TestResult -XmlWriter $XmlWriter + if ($TestResult.FailureMessage) { $XmlWriter.WriteStartElement('reason') $xmlWriter.WriteElementString('message', $TestResult.DisplayErrorMessage) @@ -649,6 +654,9 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW Failed { $XmlWriter.WriteAttributeString('result', 'Failure') $XmlWriter.WriteAttributeString('executed', 'True') + + Write-NUnitTestCaseParameters -TestResult $TestResult -XmlWriter $XmlWriter + $XmlWriter.WriteStartElement('failure') # TODO: remove monkey patching the error message when parent setup failed so this test never run @@ -694,26 +702,22 @@ function Write-NUnitTestCaseAttributes($TestResult, [System.Xml.XmlWriter] $XmlW } function Write-NUnitTestCaseParameters ($TestResult, [System.Xml.XmlWriter] $XmlWriter) { - if($TestResult.Parameters) { + if ($TestResult.Data.Count){ $XmlWriter.WriteStartElement('properties') - $TestResult.Parameters.GetEnumerator() | ForEach-Object -Process { + $TestResult.Data.GetEnumerator() | ForEach-Object -Process { + $value = $_.Value + $formattedValue = if ($null -eq $value) { + 'null' + } elseif ($value.GetType() -match 'String|Int|Boolean|Double|Float|Decimal'){ + [string] $_.Value + } elseif ($value.GetType() -match 'System.DateTime'){ + $value.ToString('u') + } else { + $_.Value | Out-String + } $XmlWriter.WriteStartElement("property") $XmlWriter.WriteAttributeString("name",$_.Name) - $value = $_.Value - $XmlWriter.WriteAttributeString( - "value", - ( - if ($null -eq $value) { - 'null' - } elseif ($value.GetType() -match 'String|Int|Boolean|Double|Float|Decimal'){ - [string] $_.Value - } elseif ($value.GetType() -match 'System.DateTime'){ - $value.ToString('u') - } else { - $_.Value | Out-String - } - ) - ) + $XmlWriter.WriteAttributeString( "value", $formattedValue ) $XmlWriter.WriteEndElement() } $XmlWriter.WriteEndElement() diff --git a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 index 377c33d5b..a1916002d 100644 --- a/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 +++ b/tst/Pester.RSpec.Nunit.TestResults.ts.ps1 @@ -301,6 +301,21 @@ i -PassThru:$PassThru { $testCase2.description | Verify-Equal 'Parameterized Testcase Value: 2' $testCase2.time | Verify-XmlTime $r.Containers[0].Blocks[0].Tests[1].Duration + $testCase1Properties = $xmlTestSuite.results.'test-case'[0].properties.property + $testCase2Properties = $xmlTestSuite.results.'test-case'[1].properties.property + + $testCase1Properties.name | Verify-Equal 'Value' + $testCase1Properties.value | Verify-Equal '1' + + $testCase2Properties[0].name | Verify-Equal 'Value' + $testCase2Properties[0].value | Verify-Equal '2' + $testCase2Properties[1].name | Verify-Equal 'StringParameter' + $testCase2Properties[1].value | Verify-Equal 'two' + $testCase2Properties[2].name | Verify-Equal 'NullParameter' + $testCase2Properties[2].value | Verify-Equal 'null' + $testCase2Properties[3].name | Verify-Equal 'NumberParameter' + $testCase2Properties[3].value | Verify-Equal '-42.67' + # verify against schema $schemaPath = (Get-Module -Name Pester).Path | Split-Path | Join-Path -ChildPath "nunit_schema_2.5.xsd" $null = $xmlResult.Schemas.Add($null, $schemaPath)