我使用.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"><DIV><DIV><P>Step 1</P></DIV></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P>Result 1</P></DIV></parameterizedString>
<description/>
</step>
<compref id="6" ref="8712">
<step id="5" type="ActionStep">
<parameterizedString isformatted="true"><DIV><P>Step 4</P></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
<step id="7" type="ActionStep">
<parameterizedString isformatted="true"><DIV><P>Step 5</P></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
<compref id="14" ref="8713">
<step id="10" type="ActionStep">
<parameterizedString isformatted="true"><DIV><DIV><P>Step 8</P></DIV></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
<step id="11" type="ActionStep">
<parameterizedString isformatted="true"><DIV><DIV><P>Step 9</P></DIV></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
<step id="12" type="ActionStep">
<parameterizedString isformatted="true"><DIV><DIV><P>Step 10</P></DIV></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
<step id="13" type="ActionStep">
<parameterizedString isformatted="true"><DIV><DIV><P><BR/></P></DIV></DIV></parameterizedString>
<parameterizedString isformatted="true"><DIV><P><BR/></P></DIV></parameterizedString>
<description/>
</step>
</compref>
</compref>
</steps>
因此,我不理解如何通过API的共享步骤来读取和管理测试用例步骤,以将该内容转换为详细步骤(描述,预期结果)的列表。
你能告诉我吗?
答案 0 :(得分:0)
我进行了测试,发现共享步骤由ref
的{{1}}属性引用。 compref
属性的值实际上是共享步骤的ref
。
详细的共享步骤未显示在元素id
中,它仅具有共享步骤的compref
ID。
驻留在元素ref
下的元素step
不是共享步骤。
获得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内容不是真正可读的;) 感谢您的帮助。