如何使用.csv文件读取数据多次运行测试(数据驱动)

时间:2014-05-05 09:29:15

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

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

3 个答案:

答案 0 :(得分:7)

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

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

下面将介绍具有一些变化的详细步骤。

Visual Studio 2010有一个"数据源向导"这做了一些步骤。 Visual Studio版本2012和2013没有向导,因此所有步骤都必须手动完成。

创建CSV文件

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

将CSV文件添加到项目中

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

确保部署了CSV文件

从解决方案资源管理器中打开CSV文件的属性面板。设置" 复制到输出目录"到" 复制如果更新"或者" 始终复制"。有些文档建议" 复制如果更新"但我更喜欢" 始终复制"偶尔没有像我预期的那样复制文件。两种复制方法之间的区别是一点磁盘空间和一点时间,但磁盘通常很大,复制时间通常很小。在我看来,通过确保正确复制文件,任何节省都远远超过了。

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

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

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

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

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

阅读CSV字段并在测试中使用

编码的UI记录和生成工具创建的类包含保存在文本框中输入或在断言中使用的值的字段。每个操作方法都有一个...Params类,每个断言方法都有一个...ExpectedValues类,其中...是方法名称。这些字段的默认值是记录测试时使用的值。在调用action或assertion方法之前,可以通过赋值覆盖记录的值。可以从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");

答案 1 :(得分: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

答案 2 :(得分: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();

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