我正在尝试为我们的一个 Web 应用程序自动化一些测试,我需要知道如何让我的 Coded UI 项目从 CSV 文件中读取数据。假设我想测试登录屏幕。我的 CSV 文件将包含一些用户名和密码。我希望我的 Coded UI 测试能够读取这些登录详细信息并遍历它们以对每组数据运行测试。
3 回答
网络上有许多关于数据驱动 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");
在编码的 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
您无需进入测试视图。只需将您的 [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();
这将获取每列中的项目并在每个测试中按顺序使用它。