如何使用.NET SDK客户端获取测试用例的共享步骤详细信息?

时间:2019-09-22 15:59:09

标签: c# azure-devops-rest-api

我使用.NET SDK客户端(NuGet上提供版本16.156.0-preview),但是我搜索如何获取包含共享步骤的测试用例步骤。 字段parameterizedString似乎包含所有测试步骤,但是当包含共享步骤时,XML内容不清楚。

我用来获取测试用例的所有测试步骤的代码示例:

private void ReadTestCaseSteps(Microsoft.VisualStudio.Services.TestManagement.TestPlanning.WebApi.TestCase testCase)
{
    foreach (var field in testCase.workItem.WorkItemFields.OfType<JObject>())
    {
        var stepsContent = ((JValue)((JContainer)field.First).First).Value.ToString();

        using (TextReader stepsReader = new StringReader(stepsContent))
        {
            var serializer = new XmlSerializer(typeof(steps));
            var steps = (steps)serializer.Deserialize(stepsReader);
        }
    }
}

“ steps”类是此示例的XML描述:

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class steps
{

    private stepsStep stepField;

    private stepsCompref comprefField;

    private byte idField;

    private byte lastField;

    /// <remarks/>
    public stepsStep step
    {
        get
        {
            return this.stepField;
        }
        set
        {
            this.stepField = value;
        }
    }

    /// <remarks/>
    public stepsCompref compref
    {
        get
        {
            return this.comprefField;
        }
        set
        {
            this.comprefField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte last
    {
        get
        {
            return this.lastField;
        }
        set
        {
            this.lastField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsStep
{

    private stepsStepParameterizedString[] parameterizedStringField;

    private object descriptionField;

    private byte idField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("parameterizedString")]
    public stepsStepParameterizedString[] parameterizedString
    {
        get
        {
            return this.parameterizedStringField;
        }
        set
        {
            this.parameterizedStringField = value;
        }
    }

    /// <remarks/>
    public object description
    {
        get
        {
            return this.descriptionField;
        }
        set
        {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsStepParameterizedString
{

    private bool isformattedField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool isformatted
    {
        get
        {
            return this.isformattedField;
        }
        set
        {
            this.isformattedField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsCompref
{

    private stepsComprefStep[] stepField;

    private stepsComprefCompref comprefField;

    private byte idField;

    private ushort refField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("step")]
    public stepsComprefStep[] step
    {
        get
        {
            return this.stepField;
        }
        set
        {
            this.stepField = value;
        }
    }

    /// <remarks/>
    public stepsComprefCompref compref
    {
        get
        {
            return this.comprefField;
        }
        set
        {
            this.comprefField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort @ref
    {
        get
        {
            return this.refField;
        }
        set
        {
            this.refField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsComprefStep
{

    private stepsComprefStepParameterizedString[] parameterizedStringField;

    private object descriptionField;

    private byte idField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("parameterizedString")]
    public stepsComprefStepParameterizedString[] parameterizedString
    {
        get
        {
            return this.parameterizedStringField;
        }
        set
        {
            this.parameterizedStringField = value;
        }
    }

    /// <remarks/>
    public object description
    {
        get
        {
            return this.descriptionField;
        }
        set
        {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsComprefStepParameterizedString
{

    private bool isformattedField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool isformatted
    {
        get
        {
            return this.isformattedField;
        }
        set
        {
            this.isformattedField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsComprefCompref
{

    private stepsComprefComprefStep[] stepField;

    private byte idField;

    private ushort refField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("step")]
    public stepsComprefComprefStep[] step
    {
        get
        {
            return this.stepField;
        }
        set
        {
            this.stepField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort @ref
    {
        get
        {
            return this.refField;
        }
        set
        {
            this.refField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsComprefComprefStep
{

    private stepsComprefComprefStepParameterizedString[] parameterizedStringField;

    private object descriptionField;

    private byte idField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("parameterizedString")]
    public stepsComprefComprefStepParameterizedString[] parameterizedString
    {
        get
        {
            return this.parameterizedStringField;
        }
        set
        {
            this.parameterizedStringField = value;
        }
    }

    /// <remarks/>
    public object description
    {
        get
        {
            return this.descriptionField;
        }
        set
        {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsComprefComprefStepParameterizedString
{

    private bool isformattedField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool isformatted
    {
        get
        {
            return this.isformattedField;
        }
        set
        {
            this.isformattedField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

使用共享步骤描述步骤的XML可能是这样的:

<steps id="0" last="14">
    <step id="2" type="ValidateStep">
        <parameterizedString isformatted="true">&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;Step 1&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</parameterizedString>
        <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;Result 1&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
        <description/>
    </step>
    <compref id="6" ref="8712">
        <step id="5" type="ActionStep">
            <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;Step 4&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
            <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
            <description/>
        </step>
        <step id="7" type="ActionStep">
            <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;Step 5&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
            <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
            <description/>
        </step>
        <compref id="14" ref="8713">
            <step id="10" type="ActionStep">
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;Step 8&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</parameterizedString>
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
                <description/>
            </step>
            <step id="11" type="ActionStep">
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;Step 9&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</parameterizedString>
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
                <description/>
            </step>
            <step id="12" type="ActionStep">
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;Step 10&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</parameterizedString>
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
                <description/>
            </step>
            <step id="13" type="ActionStep">
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</parameterizedString>
                <parameterizedString isformatted="true">&lt;DIV&gt;&lt;P&gt;&lt;BR/&gt;&lt;/P&gt;&lt;/DIV&gt;</parameterizedString>
                <description/>
            </step>
        </compref>
    </compref>
</steps>

因此,我不理解如何通过API的共享步骤来读取和管理测试用例步骤,以将该内容转换为详细步骤(描述,预期结果)的列表。

你能告诉我吗?

2 个答案:

答案 0 :(得分:0)

我进行了测试,发现共享步骤由ref的{​​{1}}属性引用。 compref属性的值实际上是共享步骤的ref

详细的共享步骤未显示在元素id中,它仅具有共享步骤的compref ID。 驻留在元素ref下的元素step不是共享步骤。

enter image description here

enter image description here

获得compref的值后,即共享步骤的ID。您可以再次调用API,以在共享步骤中获取详细步骤。

ref

正如您所说,compref xml的内容不清楚。您可能需要重新定义步骤类以反序列化xml内容,并使用ref值再次调用api。

答案 1 :(得分:0)

是的,我需要将共享步骤作为工作项阅读,并从“ Microsoft.VSTS.TCM.Steps”字段中阅读步骤。

我还更改了xml类“步骤”,以管理子步骤:

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class steps
{
    private stepsStep[] stepField;

    private steps comprefField;

    private int idField;

    private int lastField;

    private int refField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("step")]
    public stepsStep[] step
    {
        get
        {
            return this.stepField;
        }
        set
        {
            this.stepField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("compref")]
    public steps compref
    {
        get
        {
            return this.comprefField;
        }
        set
        {
            this.comprefField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int last
    {
        get
        {
            return this.lastField;
        }
        set
        {
            this.lastField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int @ref
    {
        get
        {
            return this.refField;
        }
        set
        {
            this.refField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsStep
{

    private stepsStepParameterizedString[] parameterizedStringField;

    private object descriptionField;

    private byte idField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("parameterizedString")]
    public stepsStepParameterizedString[] parameterizedString
    {
        get
        {
            return this.parameterizedStringField;
        }
        set
        {
            this.parameterizedStringField = value;
        }
    }

    /// <remarks/>
    public object description
    {
        get
        {
            return this.descriptionField;
        }
        set
        {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class stepsStepParameterizedString
{

    private bool isformattedField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool isformatted
    {
        get
        {
            return this.isformattedField;
        }
        set
        {
            this.isformattedField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

xml内容不是真正可读的;) 感谢您的帮助。