5

いくつかのtrxファイル(webTestResults)を分析して、合成Excelファイルを出力しようとしています。

まず、trx xsdスキーマ(ビジュアルスタジオディレクトリのvstst.xsd)を使用して、一連のC#クラスを生成します。

次に、(スキーマから生成された)TestRunTypeのタイプに基づいてXmlSerializerをインスタンス化しようとします。

XmlSerializer xmlSer = new XmlSerializer(typeof(TestRunType));

XMLSerializerのインスタンス化により、例外が発生します。

System.InvalidOperationException: There was an error reflecting type 'TestRunType'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: There was an error reflecting type 'TestRunTypeTestDefinitions'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: There was an error reflecting type 'OrderedTestType'. ---> System.InvalidOperationException: There was an error reflecting type 'CodedWebTestElementType'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: Member 'CodedWebTestElementType.Items' hides inherited member 'BaseTestType.Items', but has different custom attributes.
   at System.Xml.Serialization.StructMapping.FindDeclaringMapping(MemberMapping member, StructMapping& declaringMapping, String parent)
   at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)

カスタム属性とは何ですか?BaseTestTypeの始まり:

public abstract partial class BaseTestType {

    private object[] itemsField;

    private bool enabledField;

    private string idField;

    private string nameField;

    private bool isGroupableField;

    private int priorityField;

    private string namedCategoryField;

    private string storageField;

    public BaseTestType() {
        this.enabledField = true;
        this.isGroupableField = true;
        this.priorityField = 2147483647;
        this.namedCategoryField = "";
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Agent", typeof(BaseTestTypeAgent))]
    [System.Xml.Serialization.XmlElementAttribute("Css", typeof(BaseTestTypeCss))]
    [System.Xml.Serialization.XmlElementAttribute("DeploymentItems", typeof(BaseTestTypeDeploymentItems))]
    [System.Xml.Serialization.XmlElementAttribute("Description", typeof(object))]
    [System.Xml.Serialization.XmlElementAttribute("Execution", typeof(BaseTestTypeExecution))]
    [System.Xml.Serialization.XmlElementAttribute("Owners", typeof(BaseTestTypeOwners))]
    [System.Xml.Serialization.XmlElementAttribute("Properties", typeof(BaseTestTypeProperties))]
    [System.Xml.Serialization.XmlElementAttribute("TcmInformation", typeof(TcmInformationType))]
    [System.Xml.Serialization.XmlElementAttribute("TestCategory", typeof(BaseTestTypeTestCategory))]
    [System.Xml.Serialization.XmlElementAttribute("WorkItemIDs", typeof(WorkItemIDsType))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }

そしてCodedWebTestElementType:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://microsoft.com/schemas/VisualStudio/TeamTest/2010")]
public partial class CodedWebTestElementType : BaseTestType {

    private object[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("IncludedWebTests", typeof(CodedWebTestElementTypeIncludedWebTests))]
    [System.Xml.Serialization.XmlElementAttribute("WebTestClass", typeof(CodedWebTestElementTypeWebTestClass))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

誰かが私に問題が何であるかを説明できますか?

ありがとう...

4

1 に答える 1

10

解決策は、派生クラス (CodedWebTestElementTypeおよびGenericTestType) から Items プロパティを削除することですが、コード化された Web テストまたは汎用テストがある場合に値を見逃さないように、シリアライゼーション属性も基本クラスに移動します。

IOW、解決策は次のとおりです。

まず、型Itemsからプロパティを削除しますCodedWebTestElementType

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://microsoft.com/schemas/VisualStudio/TeamTest/2010")]
public partial class CodedWebTestElementType : BaseTestType {
}

次に、その 2 つのXmlElementAttribute属性をBaseTestType基本クラスに移動します (最後の 2 つを参照)。

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Agent", typeof(BaseTestTypeAgent))]
[System.Xml.Serialization.XmlElementAttribute("Css", typeof(BaseTestTypeCss))]
[System.Xml.Serialization.XmlElementAttribute("DeploymentItems", typeof(BaseTestTypeDeploymentItems))]
[System.Xml.Serialization.XmlElementAttribute("Description", typeof(object))]
[System.Xml.Serialization.XmlElementAttribute("Execution", typeof(BaseTestTypeExecution))]
[System.Xml.Serialization.XmlElementAttribute("Owners", typeof(BaseTestTypeOwners))]
[System.Xml.Serialization.XmlElementAttribute("Properties", typeof(BaseTestTypeProperties))]
[System.Xml.Serialization.XmlElementAttribute("TcmInformation", typeof(TcmInformationType))]
[System.Xml.Serialization.XmlElementAttribute("TestCategory", typeof(BaseTestTypeTestCategory))]
[System.Xml.Serialization.XmlElementAttribute("WorkItemIDs", typeof(WorkItemIDsType))]
[System.Xml.Serialization.XmlElementAttribute("IncludedWebTests", typeof(CodedWebTestElementTypeIncludedWebTests))]
[System.Xml.Serialization.XmlElementAttribute("WebTestClass", typeof(CodedWebTestElementTypeWebTestClass))]
public object[] Items
{
    get {
        return this.itemsField;
    }
    set {
        this.itemsField = value;
    }
}

その後、GenericTestTypeクラスに対して同じことを行います。

これにより、ある日、 IncludedWebTestsWebTestClassCommandまたはSummaryXmlFileノードを取得した場合でも、情報が失われることはありません。

于 2012-06-03T18:51:21.620 に答える