2016-06-10 137 views
0

我正在嘗試寫一些類似於Nunit報告分析器/收集器的失敗測試,​​並且在嘗試反序列化測試報告時被卡住。反序列化可能具有不同元素但具有相同類別的XML集合

NUnit的報告具有以下結構:

<test-results ... > 
    <test-suite> 
     <results> 
      <test-suite> or <test-case> bunch of elements 
       <failure> // optional 
     </results> 
    </test-suite> 
</test-results> 

所以測試套件的元素可能有兩種結果的收集與其他測試套件的元素或結果與收集測試案例元素。 由於測試套件已經相同的屬性的測試情況下,它可以被序列化爲一種類型的類:

[Serializable()] 
public class TestResult 
{ 
    [XmlAttribute("name")] 
    public String Name { get; set; } 
    [XmlAttribute("executed")] 
    public String Executed { get; set; } 

    [XmlAttribute("success")] 
    public String Success { get; set; } 

    [XmlElement("failure", IsNullable = true)] 
    public Failure Failure { get; set; } 

    [XmlElement("results")] 
    public Results Results { get; set; } 

    [XmlAttribute("result")] 
    public String Result { get; set; } 

    [XmlAttribute("time")] 
    public String Time { get; set; } 

    [XmlAttribute("asserts")] 
    public String Asserts { get; set; }  
} 

[Serializable()] 
public class TestCase : TestResult 
{ 

} 

[Serializable()] 
public class TestSuite : TestResult 
{ 
    [XmlAttribute("type")] 
    public String Type { get; set; } 
} 

和結果類假設爲具有測試套件或測試箱子的列表:

[Serializable()] 
    public class Results 
    { 
     [XmlArray("results")] 
     [XmlArrayItem("test-case", Type = typeof(TestCase))] 
     [XmlArrayItem("test-suite", Type = typeof(TestSuite))] 
     public List<Result> Result { get; set; } 
    } 

這裏TestCase和TestSuite是Result的空子類,因爲arrtibutes和元素是相同的。從集合中沒有這種方式序列化的項目。如果我試圖爲每個項目指定多個ArrauItem-s而沒有專門的類型,那麼pardser認爲它是無曖昧的。

我怎樣才能實際serialzie收集與不同但相關的元素?

回答

1

我相信下面的結構序列化到你想要的模式(除去非必要屬性):

public class TestResult 
{ 
    ... 

    [XmlElement("results")] 
    public TestResultsCollection Results { get; set; } 

    ... 
} 

public class TestCase : TestResult 
{ 
} 

public class TestSuite : TestResult 
{ 
    [XmlAttribute("type")] 
    public String Type { get; set; } 
} 

[XmlRoot("test-results")] 
public class TestResultsCollection 
{ 
    [XmlElement("test-case", Type = typeof(TestCase))] 
    [XmlElement("test-suite", Type = typeof(TestSuite))] 
    public List<TestResult> Results { get; set; } 
} 

這是我如何用它來序列化/反序列化:

var serializer = new XmlSerializer(typeof (TestResultsCollection)); 

var testResultsCollection = new TestResultsCollection(); 
testResultsCollection.Items = new List<TestResult> 
{ 
    new TestSuite 
    { 
     Results = new TestResultsCollection 
     { 
      Items = new List<TestResult> {new TestCase(), new TestSuite()} 
     } 
    }, 
    new TestCase 
    { 
     Results = new TestResultsCollection 
     { 
      Items = new List<TestResult> {new TestCase(), new TestSuite()} 
     } 
    } 
}; 

using (var fileStream = File.CreateText("output.xml")) 
{ 
    serializer.Serialize(fileStream, testResultsCollection); 
} 

using (var fileStream = File.OpenText("output.xml")) 
{ 
    var deserialized = (TestResultsCollection)serializer.Deserialize(fileStream); 
} 
相關問題