【问题标题】:How to run a test many times with data read from .csv file (data driving)如何使用从 .csv 文件中读取的数据多次运行测试(数据驱动)
【发布时间】:2014-05-05 09:29:14
【问题描述】:

我正在尝试对我们的一个 Web 应用程序进行自动化测试,我需要知道如何让我的 Coded UI 项目从 CSV 文件中读取数据。假设我想测试登录屏幕。我的 CSV 文件将包含一些用户名和密码。我希望我的 Coded UI 测试能够读取这些登录详细信息并遍历它们以对每组数据运行测试。

【问题讨论】:

标签: c# visual-studio-2012 automated-tests coded-ui-tests data-driven-tests


【解决方案1】:

网络上有许多关于数据驱动 Coded UI 测试的教程。使用 CSV 文件进行数据驱动的基本步骤如下。

  • 创建 CSV 文件。
  • 将 CSV 文件添加到项目中。
  • 确保已部署 CSV 文件。
  • 将 CSV 文件添加为单个测试的数据源。
  • 读取 CSV 字段并在测试中使用它们。

下面解释了详细的步骤,以及一些变化。

Visual Studio 2010 有一个“数据源向导”,可以执行其中的一些步骤。 Visual Studio 2012 和 2013 版没有向导,因此所有步骤都必须手动完成。

创建 CSV 文件

一种方法是在电子表格中创建文件,然后将其保存为逗号分隔值。另一种方法是使用文本编辑器并只编写文件。我使用电子表格程序处理大数据源文件,使用文本编辑器创建小文件。一些编辑器在文件开头添加字节顺序标记 (BOM),该标记将添加到 CSV 的第一个字段名称,这似乎使该字段不可读。有关 BOM 的更多信息,请参阅 this page。

将 CSV 文件添加到项目中

使用解决方案资源管理器中的上下文菜单,选择添加 -> 现有项目。然后浏览到所需的文件。请注意,文件过滤器可能需要更改为 *.* 或 *.csv。

确保已部署 CSV 文件

从解决方案资源管理器中打开 CSV 文件的属性面板。将“复制到输出目录”设置为“如果较新则复制”或“始终复制”。一些文档推荐“Copy if newer”,但我更喜欢“Copy always”,因为有时文件没有按预期复制。两种复制方法的区别是磁盘空间小,时间少,但是磁盘通常很大,而复制的时间通常很小。在我看来,任何节省都远远超过确保文件将被正确复制。

将 CSV 文件添加为单个测试的数据源

将[TestMethod] 属性替换为正确的数据源行。这个Microsoft blog 显示了几种可能的数据源文件类型的替换代码。对于 CSV 使用:

[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV",
    "|DataDirectory|\\data.csv", "data#csv",
    DataAccessMethod.Sequential), DeploymentItem("data.csv"),
    TestMethod]

请注意,文件名出现了 3 次,其中一个副本具有 # 而不是 .。我没有找到任何关于 Datasource(...) 属性的不同字段的有用文档,因此无法进一步建议如何为非 CSV 数据源选择值。

上面的|DataDirectory| 部分被替换为测试运行时部署文件的目录。如果需要,字符串引号中的整个文件名可以替换为文件的完整路径名。

读取 CSV 字段并在测试中使用它们

Coded UI 记录和生成工具创建的类具有字段,这些字段保存输入到文本框中或在断言中使用的值。每个动作方法都有一个...Params 类,每个断言方法都有一个...ExpectedValues 类,其中... 是方法名称。这些字段的默认值是记录测试时使用的值。在调用动作或断言方法之前,记录的值可以被赋值覆盖。从TestContext.DataRow[...]访问数据源当前行的字段。

假设 Coded UI 测试有一个 EnterValue 方法将文本写入屏幕的两个字段,它还有一个 CheckResult 方法断言一个字段。测试方法可以写成如下。

[DataSource...
    TestMethod]
public void CodedUITestMethod1()
{
    this.UIMap.EnterValueParams.UIItem0TextSendKeys = TestContext.DataRow["ValueOne"].ToString();
    this.UIMap.EnterValueParams.UIItem1TextSendKeys = TestContext.DataRow["ValueTwo"].ToString();
    this.UIMap.EnterValue();

    this.UIMap.CheckResultExpectedValues.UIItem0TextDisplayText = TestContext.DataRow["Result"].ToString();
    this.UIMap.CheckResult();
}

...Params 和 ...ExpectedValues 类允许测试在测试运行时创建值。例如,如果EnterValue 方法还想将明天的日期写入字段,我们可以在调用它之前添加以下行:

this.UIMap.EnterValueParams.UIItem2TextSendKeys = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");

【讨论】:

  • The |DataDirectory| part above is replaced by the directory where files are deployed when the tests run ...如何确定该目录?
  • @ScottBaker DataDirectory 在测试运行时在TestContext 中可用。实际位置是动态的,并在部署运行测试时选择。请阅读 Microsoft 页面中有关 Coded UI 的测试部署。
【解决方案2】:

在编码的 UI 测试中添加数据源属性。

[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\data.csv", "data#csv", DataAccessMethod.Sequential), DeploymentItem("data.csv"), TestMethod]

注意:此数据源驱动程序根据第一个数据行中的数据确定单元格类型。如果您有一列应该格式化为字符串,但第一个数据行有一个数字,例如1234。如果以下行不为空,则将返回为 0。

希望,此链接可能对您有所帮助: http://blogs.msdn.com/b/mathew_aniyan/archive/2009/03/17/data-driving-coded-ui-tests.aspx

【讨论】:

  • 谢谢。我对这个链接的唯一问题是作者提到用户进入“测试视图”。不幸的是,这在 Visual Studio 2012 上不存在。
  • @N-ate 是否能够提供任何有关确定类型的第一个数据行的 Microsoft 文档的链接?
  • 我没有找到任何文档。我转换了一套近 600 个测试来使用这个驱动程序,这让我非常头疼,直到我在 csv 中添加了一个我在测试中忽略的模拟行。例如。 “字符串”,1,“字符串”,“字符串”。令人惊讶的是,生成的对象具有错误属性,并且没有任何迹象表明出现任何问题。
  • DeploymentItem("data.csv") 和 TestMethod 是什么项目。我没有它们,我想知道我是否需要它们。
【解决方案3】:

您无需进入测试视图。只需将您的 [TestMethod] 替换为以下脚本:

[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\LoginInfo.csv", "Sheet$1", DataAccessMethod.Sequential), DeploymentItem("LoginInfo.csv"), TestMethod]

从那里,将 LoginInfo.csv 更改为您的 .csv 文件的名称。要引用您的数据,只需使用:

// Username and Password are Column Headers
UIMap.LoginParams.UserNameTextBox = TestContext.DataRow["UserName"].ToString();
UIMap.LoginParams.PasswordTextBox = TestContext.DataRow["Password"].ToString();
UIMap.Login();

这将获取每列中的项目并在每个测试中按顺序使用它。

【讨论】:

  • 谢谢你,我要试试这个。
  • 刚刚注意到link 中他们说“不要直接修改 UIMap.designer.cs 文件。如果这样做,对文件的更改将被覆盖。” - 知道这段代码应该在哪里输入吗?
  • 是的,当您在 UIMap UI 中时,右键单击“移动代码”的方法。见附件链接link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2016-03-16
  • 2017-08-05
相关资源
最近更新 更多