2

我在 Visual Studio 2012 中有一个数据驱动的 Web 性能测试。我想从一个PreRequest()或一个PostRequest()插件中的数据源访问值。已经通过诸如{{DataSource1.PaymentAccounts#csv.USER_ID}}.

我的最终目标是将值写入网络日志评论,以便更容易识别失败测试的数据源值。所以这些值将被传递给e.WebTest.AddCommentToResult(string.Format(...)).

4

2 回答 2

2

这些值存储在文本上下文中,因此可以使用 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

于 2013-05-17T15:34:59.800 回答
2
[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");
            }

        }
    }

两个关键提示:

  1. 当心缺少ANSI!确保您已根据此 stackoverflow 帖子将 DS 文件(csv 文件)保存为 ANSI 。开头的那些 unicode 字节顺序标记会使您在编写 DS 字符串时难以引用列名。“DataSource1.mycsvfile#csv.myDSColumnName”比“DataSource1.mycsvfile#csv.myDSColumnName”好得多

然后,除了 trygetvalue (这很好)之外,您还应该能够简单地编写:

string currentRowFromDS = e.WebTest.Context["DataSource1.mycsvfile#csv.myDSColumnName"].ToString();
  1. 将 DS 添加到 webtest 后,请务必将“选择列”属性更改为“选择所有列”(而不是“仅选择绑定列”)。如果您将其保留为默认值,“仅选择绑定的列”,并且您尚未实际绑定列,则 Visual Studio 不会将行值放入 Web 测试中。上下文参数根本不存在。

这种行为不同于单元测试中的 SQL 数据源,例如,您只需分配变量。通常,用于将数据添加到单元测试的 API (Microsoft.VisualStudio.TestTools.UnitTesting) 与用于将数据添加到 Web 测试的 API (Microsoft.VisualStudio.TestTools.WebTesting) 略有不同。

于 2018-04-06T22:49:51.607 回答