我在 Visual Studio 2012 中有一个数据驱动的 Web 性能测试。我想从一个PreRequest()
或一个PostRequest()
插件中的数据源访问值。已经通过诸如{{DataSource1.PaymentAccounts#csv.USER_ID}}
.
我的最终目标是将值写入网络日志评论,以便更容易识别失败测试的数据源值。所以这些值将被传递给e.WebTest.AddCommentToResult(string.Format(...))
.
我在 Visual Studio 2012 中有一个数据驱动的 Web 性能测试。我想从一个PreRequest()
或一个PostRequest()
插件中的数据源访问值。已经通过诸如{{DataSource1.PaymentAccounts#csv.USER_ID}}
.
我的最终目标是将值写入网络日志评论,以便更容易识别失败测试的数据源值。所以这些值将被传递给e.WebTest.AddCommentToResult(string.Format(...))
.
这些值存储在文本上下文中,因此可以使用 WebTestRequestPlugin 代码访问该值,例如:
object contextParameterObject;
if ( e.WebTest.Context.TryGetValue("DataSource1.PaymentAccounts#csv.USER_ID",
out contextParameterObject) ) {
string contextParameter = contextParameterObject.ToString();
e.WebTest.AddCommentToResult(contextParameter);
}
else {
throw new WebTestException("'DataSource1.PaymentAccounts#csv.USER_ID' not found");
}
默认情况下,上下文仅包含在 Web 测试文件中明确使用的数据源的那些字段(列)。要使数据源中的所有字段都可用,请将数据源文件的Select columns属性设置为Select all columns。
[Description("Captures the datasource value used in a request and writes it to a file.")]
public class WriteDataSourceValueToFile : WebTestRequestPlugin
{
[Description("The name of the file to save the scraped values to. E.g., ResponseTimes.log. ")]
public string OutputFileName { get; set; }
[Description(@"Path of the file to save the scraped values to. Format: C:\temp. (Note no trailing backslash.)")]
public string OutputPathName { get; set; }
// The LogWriter class is in the main project, not in the utilities project.
private LogWriter writer = LogWriter.Instance;
[System.ComponentModel.Description("Name of the datasource.")]
[System.ComponentModel.DefaultValue("UserIds")]
public string DatasourceName { get; set; }
[System.ComponentModel.Description("Name of the CSV file. Use the syntax that Visual Studio uses, with a # sign in place of the period. E.g., UserIds#csv")]
[System.ComponentModel.DefaultValue("UserIds#csv")]
public string CsvFileName { get; set; }
[System.ComponentModel.Description("Field name in the CSV file")]
[System.ComponentModel.DefaultValue("UserIds")]
public string FieldName { get; set; }
public override void PreRequest(object sender, PreRequestEventArgs e)
{
}
public override void PostRequest(object sender, PostRequestEventArgs e)
{
object contextParameterObject;
if (e.WebTest.Context.TryGetValue(DatasourceName + "." + CsvFileName + "." + FieldName,
out contextParameterObject))
{
writer.WriteToLog($"Value chosen from {DatasourceName } ={contextParameterObject.ToString()}" );
}
else
{
throw new WebTestException(DatasourceName + "." + CsvFileName + "." + FieldName + " not found");
}
}
}
两个关键提示:
然后,除了 trygetvalue (这很好)之外,您还应该能够简单地编写:
string currentRowFromDS = e.WebTest.Context["DataSource1.mycsvfile#csv.myDSColumnName"].ToString();
这种行为不同于单元测试中的 SQL 数据源,例如,您只需分配变量。通常,用于将数据添加到单元测试的 API (Microsoft.VisualStudio.TestTools.UnitTesting) 与用于将数据添加到 Web 测试的 API (Microsoft.VisualStudio.TestTools.WebTesting) 略有不同。