4

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

4

3 回答 3

10

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

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

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

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

创建 CSV 文件

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

将 CSV 文件添加到项目中

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

确保已部署 CSV 文件

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

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

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

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

请注意,文件名出现了 3 次,其中一个副本具有 a#而不是.. 我没有找到任何关于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");
于 2014-09-09T10:16:25.933 回答
3

在编码的 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

于 2014-05-05T09:44:05.820 回答
2

您无需进入测试视图。只需将您的 [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();

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

于 2014-05-05T16:18:54.457 回答