如何使用从.csv文件读取的数据(数据驱动)多次运行testing
我试图自动化一些我们的Web应用程序的testing,我需要知道如何使我的Coded UI项目从CSV文件中读取数据。 比方说,我想testinglogin屏幕。 我的CSV文件将包含一些用户名和密码。 我希望我的Coded UItesting能够详细阅读这些日志,并通过它们循环来对每组数据运行testing。
网上有很多关于数据驱动编码UItesting的教程。 使用CSV文件进行数据驱动的基本步骤如下。
- 创buildCSV文件。
- 将CSV文件添加到项目中。
- 确保已部署CSV文件。
- 添加CSV文件作为单个testing的数据源。
- 阅读CSV字段并在testing中使用它们。
下面解释具体步骤和一些变化。
Visual Studio 2010有一个“数据源向导”,可以执行其中的一些步骤。 Visual Studio版本2012和2013没有向导,所以所有的步骤都必须手动完成。
创buildCSV文件
一种方法是在电子表格中创build文件,然后将其保存为逗号分隔值。 另一种方法是使用文本编辑器,只写文件。 我使用大数据源文件的电子表格程序和用于创build小文件的文本编辑器。 有些编辑器会在文件的开始处添加一个字节顺序标记(BOM),将其添加到CSV的第一个字段名称中,这看起来使字段不可读。 有关BOM的更多信息,请参阅此页面 。
将CSV文件添加到项目中
使用解决scheme资源pipe理器中的上下文菜单,select添加 – > 现有项目 。 然后浏览到所需的文件。 请注意,文件filter可能需要更改为*.*
或*.csv
。
确保已部署CSV文件
从解决scheme资源pipe理器打开CSV文件的属性面板。 将“ 复制到输出目录 ”设置为“ 如果更新则复制 ”或“ 总是复制 ”。 一些文件build议“ 复制如果更新 ”,但我更喜欢“ 总是复制 ”,偶尔文件没有按照我的预期复制。 这两种复制方法之间的区别是有一点磁盘空间和一点时间,但磁盘通常很大,复制的时间通常很less。 在我看来,任何储蓄都远远超过了确保文件被正确复制的重要性。
添加CSV文件作为单个testing的数据源
用正确的数据源行replace[TestMethod]
属性。 此Microsoft博客显示了几种可能的数据源文件types的替代代码。 对于CSV使用:
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\data.csv", "data#csv", DataAccessMethod.Sequential), DeploymentItem("data.csv"), TestMethod]
请注意,文件名发生三次,一个副本有一个#
而不是一个.
。 我还没有find关于Datasource(...)
属性的不同字段的任何有用的文档,所以不能进一步build议如何select非CSV数据源的值。
|DataDirectory|
上面的部分被replace为运行testing时部署文件的目录。 如果需要,string引号内的整个文件名可以用文件的完整path名replace。
阅读CSV字段并在testing中使用它们
编码的UIlogging和生成工具创build类,其中包含input到文本框中或用于断言中的值。 每个操作方法都有一个...Params
类和每个断言方法都有一个...ExpectedValues
类,其中...
是方法名称。 这些字段的默认值是loggingtesting时使用的值。 在动作或断言方法被调用之前,logging的值可以被赋值覆盖。 数据源的当前行的字段是从TestContext.DataRow[...]
访问的。
假设一个编码的UItesting有一个EnterValue
方法,它将文本写入屏幕的两个字段,并且还有一个声明一个字段的CheckResult
方法。 testing方法可能会被编写如下。
[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
类允许testing在testing运行时创build值。 例如,如果EnterValue
方法也想将明天的date写入一个字段,我们可以在调用之前添加下面一行:
this.UIMap.EnterValueParams.UIItem2TextSendKeys = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
在编码UItesting中添加数据源属性。
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\data.csv", "data#csv", DataAccessMethod.Sequential), DeploymentItem("data.csv"), TestMethod]
希望这个链接可以帮助你: http : //blogs.msdn.com/b/mathew_aniyan/archive/2009/03/17/data-driving-coded-ui-tests.aspx
你不需要进入testing视图。 只需用下面的脚本replace你的[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();
这将采取每个列中的项目,并在每个testing中顺序使用它。