Попытка сравнить ответ веб-службы и ожидаемый XML из файла - PullRequest
1 голос
/ 25 января 2012

Мы больше всего разрабатываем на Java, но мы хотим провести интеграционный тест (с использованием https://github.com/scottmuc/Pester) наших веб-сервисов также с ms. Для этого я пишу сценарии powershell, которые подключаются к сети).-service и сравнивает ответ с xml, который я загрузил из файла.

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$instance = New-WebServiceProxy -Uri "https://localhost:7002/service?WSDL" -Namespace "myspace"
$instance.Credentials = new-object System.Net.NetworkCredential("user", "pass")
...
$reply = $instance.fetchInformation($inputA, $inputB)
[xml]$expected = Get-Content ("expected.xml")
...

Однако теперь у меня есть $ reply, который содержит объекты из пространства имен myspace и $ Ожидаемый, который содержит XMLNode.Я вижу два способа сделать это (возможно, их гораздо больше):

  1. Получить исходный XML-ответ и сравнить его. Однако я не могу понять, как это получить.
  2. Сериализация $ ожидаемого XML в объекты пространства имен myspace. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Вы можете сериализовать ответ , возвращенный веб-службой, в XML и сравнить его с содержимым expected.xml файла в виде строк .

Вотпример:

$writer = New-Object System.IO.StringWriter
$serializer = New-Object System.Xml.Serialization.XmlSerializer($reply.GetType())
$serializer.Serialize($writer, $reply)

$replyAsXml = $writer.ToString()
$expectedReplyAsXml = Get-Content expected.xml

$replyAsXml -eq $expectedReplyAsXml

Обратите внимание, что в этом примере вам необходимо убедиться, что XML, содержащийся в файле expected.xml, совпадает с XML, возвращаемым XmlSerializer , также в отношении пробелов и отступов,Чтобы избежать этого, вы можете удалить все дополнительные символы (такие как пробелы и переводы строк ) из двух строк перед их сравнением.

0 голосов
/ 22 февраля 2012

Я закончил с совершенно другим подходом. Два XML сильно отличались друг от друга, поэтому вместо этого я создал собственный компаратор. Это позволило мне просто написать собственный код, чтобы игнорировать неинтересные различия.

Это приводит к некоторой куче сырого кода, который выполняет работу:

# Assume two arrays of equal length
Function Zip {
    Param($a1, $a2)

    $sum = New-Object object[] $a1.Count
    For ($i = 0; $i -lt $a1.Count; ++$i) {
        $sum[$i] = New-Object object[] 2
        $sum[$i][0] = $a1[$i]
        $sum[$i][1] = $a2[$i]
    }
    Return ,$sum
}


Function XmlChildNodes2List{
    param($nodes)
    $myArray = New-Object object[] 0
    For ($i = 0; $i -lt $nodes.Count; ++$i) {
        $node = $nodes.Item($i)
        If ($node -ne $null) {
            $myArray += $node
        }
    }
    Return ,$myArray
}

Function ShowContext{
    Param($ctx)
    " at " + $ctx
}

Function CompareNode{
    Param($o1, $o2, $ctx)

    Try {
    Switch ($o1.GetType().Name) {
        "XmlDocument" {
            CompareXml $o1.ChildNodes $o2.ChildNodes
        }
        "XmlChildNodes" {
            $olist1 = XmlChildNodes2List $o1 | Sort
            $olist2 = XmlChildNodes2List $o2 | Sort
            If ($olist1.Count -ne $olist2.Count) {
                $msg = "Unequal child node count " + ($olist1 -join ",") + " and " + ($olist2 -join ",") + (ShowContext $ctx)
                throw $msg
            } Else {
                $list = Zip $olist1 $olist2
                $value = $true
                foreach ($item in $list) {
                    if ($value -eq $true) {
                        $value = CompareXml $item[0] $item[1] $ctx
                    }
                }
                $value
            }
        }
        "XmlElement" {
            If ($o1.LocalName -eq $o2.LocalName) {
                If ($o1.LocalName -eq "uninterestingElement" -or $o1.LocalName -eq "uninterestingElement2") {
                    $true
                } Else {
                    CompareXML $o1.ChildNodes $o2.ChildNodes ($ctx + "/" + $o1.LocalName)
                }
            } Else {
                throw ("Element " + $o1.LocalName + " != " + $o2.LocalName + (ShowContext $ctx))
            }
        }
        "XmlDeclaration" {
            $true
        }
        "XmlText" {
            $result = $o1.InnerText.Replace("`r`n","`n")
            $expect = $o2.InnerText.Replace("`r`n","`n")
            # TODO: Hack to remove timezone from expected dates in format 2005-09-01+02:00, the webservice side of the
            # reply to xml-conversion looses them
            If ($expect -match "^(\d{4}-\d\d-\d\d)\+\d\d:\d\d$") {
                $expect = $Matches[1]
            }
            If ($result -eq $expect) {
                $true
            } Else {
                throw ($o1.InnerText + " is not equal to " + $o2.InnerText + (ShowContext $ctx))
            }
        }
        Default {
            throw ("What to do with node " + $o1.GetType().Name + (ShowContext $ctx))
        }
    }
    } Catch [Exception] {
        throw $_
    }
}

Function CompareXML{
    Param($o1, $o2, $ctx)

    If ($o1 -eq $null -and $o2 -eq $null) {
        $true
    } ElseIf ($o1 -eq $null -or $o2 -eq $null) {
        throw ("Response or expected is null")
    } ElseIf ($o1.GetType() -eq $o2.GetType()) {
        CompareNode $o1 $o2 $ctx
    } Else {
        throw ($o1.GetType().Name + " is not " + $o2.GetType().Name + (ShowContext $ctx))
    }
}

Затем можно запустить два XML-файла следующим образом:

CompareXML $result $expected ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...