本文首要介绍怎样在Coded UI

怎么样选用命令行格局运营测试方法?

  内容如下:

namespace CodedUITestProject2.UIMap1Classes
{
    using Microsoft.VisualStudio.TestTools.UITesting.HtmlControls;
    using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
    using System;
    using System.Collections.Generic;
    using System.CodeDom.Compiler;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;
    using Mouse = Microsoft.VisualStudio.TestTools.UITesting.Mouse;
    using MouseButtons = System.Windows.Forms.MouseButtons;
    using System.Drawing;
    using System.Windows.Input;
    using System.Text.RegularExpressions;


    public partial class UIMap1
    {
        public void TestSearchResult()
        {
            HtmlDiv resultPanel = this.UINewtabInternetExplorWindow.UIJaxucnblogs_SearchDocument.UIContent_leftPane;
            HtmlDiv resultPanelFirst = (HtmlDiv)resultPanel.GetChildren()[0];
            HtmlHyperlink link = new HtmlHyperlink(resultPanelFirst);
            Assert.AreEqual("Jaxu - 博客园", link.InnerText, "Validation is failed.");
        }

        /// <summary>
        /// RecordedMethod1 - Use 'RecordedMethod1Params' to pass parameters into this method.
        /// </summary>
        public void RecordedMethod1()
        {
            #region Variable Declarations
            WinEdit uIItemEdit = this.UINewtabInternetExplorWindow.UIItemWindow.UIItemEdit;
            HtmlEdit uIWDEdit = this.UINewtabInternetExplorWindow.UIDocument.UIWDEdit;
            HtmlInputButton uISearchButton = this.UINewtabInternetExplorWindow.UIDocument.UISearchButton;
            #endregion

            // Go to web page 'about:Tabs' using new browser instance
            this.UINewtabInternetExplorWindow.LaunchUrl(new Uri("http://www.baidu.com"));

            // Type 'www.baidu{Enter}' in text box
            //Keyboard.SendKeys(uIItemEdit, this.RecordedMethod1Params.UIItemEditSendKeys, ModifierKeys.None);

            // Type 'jaxu cnblogs' in 'wd' text box
            uIWDEdit.Text = this.RecordedMethod1Params.UIWDEditText;

            // Click '百度一下' button
            Mouse.Click(uISearchButton, new Point(61, 18));
        }

        public virtual RecordedMethod1Params RecordedMethod1Params
        {
            get
            {
                if ((this.mRecordedMethod1Params == null))
                {
                    this.mRecordedMethod1Params = new RecordedMethod1Params();
                }
                return this.mRecordedMethod1Params;
            }
        }

        private RecordedMethod1Params mRecordedMethod1Params;
    }
    /// <summary>
    /// Parameters to be passed into 'RecordedMethod1'
    /// </summary>
    [GeneratedCode("Coded UITest Builder", "12.0.21005.1")]
    public class RecordedMethod1Params
    {

        #region Fields
        /// <summary>
        /// Go to web page 'about:Tabs' using new browser instance
        /// </summary>
        public string UINewtabInternetExplorWindowUrl = "about:Tabs";

        /// <summary>
        /// Type 'www.baidu{Enter}' in text box
        /// </summary>
        public string UIItemEditSendKeys = "www.baidu{Enter}";

        /// <summary>
        /// Type 'jaxu cnblogs' in 'wd' text box
        /// </summary>
        public string UIWDEditText = "jaxu cnblogs";
        #endregion
    }
}

  私有方法GetExcelData()用来读取Excel文件中的数据,在那之中使用了Microsoft.Office.Interop.Excel程序集中的对象,供给在工程中单独添加引用。数据按行和列的不二诀要存放到Dicitionary字典目的中,字典中的Key为每1行的行号,Value则是另3个字典,包涵该行全体的列。事实上,程序中的其余地点也利用了那种数据存款和储蓄结构。

Coded UI Test怎样搜索一个控件?

BrowserType
IE
firefox
chrome
public class TestSettings
{
    public static void AddResult(List<string> resultList, string result)
    {
        if (result != null)
        {
            if (resultList == null)
            {
                resultList = new List<string>();
            }
            resultList.Add(result);
        }
    }
}

  注意第2行是标题,[DataSource]特色属性在读取数据时始终会将率先行暗中认可为标题行,数据私下认可是从第一行早先读取的。浏览器只需求提供名称即可,大小写未有提到。假诺你的测试方法需求在分化的浏览器中实现测试,则足以品尝该方法,但自个儿不保障内部是或不是会波及到包容性难题,就像是自家在前一篇作品中涉嫌的Coded
UI
Test怎样在页面上查找多少个控件,要是搜索的基准存在浏览器包容性难点,则或许会抛出十分。

if (faillist != null && faillist.Count > 0)
{
    StringBuilder fail = new StringBuilder();
    foreach (string s in faillist)
    {
        fail.AppendLine(s);
    }
    Assert.Fail(fail.ToString());
}
public partial class UIMap2
{
    public void LaunchPage()
    {
        this.UIExcelInteractiveViewWindow.LaunchUrl(new Uri("http://www.cnblogs.com/jaxu/p/3635634.html"));
    }

    public void TestTableData()
    {
        HtmlTable targetTable = this.UIExcelInteractiveViewWindow.UIExcelInteractiveViewDocument.UICnblogs_post_bodyPane.UIItemTable;
        HtmlRow rowall = new HtmlRow(targetTable);
        UITestControlCollection rows = rowall.FindMatchingControls();
        Dictionary<int, Dictionary<int, string>> PageTableDataCache = new Dictionary<int, Dictionary<int, string>>();
        int rowCount = rows.Count;

        for (int i = 0; i < rowCount; i++)
        {
            HtmlCell allTD = new HtmlCell(rows[i]);
            UITestControlCollection TDs = allTD.FindMatchingControls();
            Dictionary<int, string> cellsDictionary = new Dictionary<int, string>();

            int tdCount = TDs.Count;
            for (int j = 0; j < tdCount; j++)
            {
                cellsDictionary.Add(j, ((HtmlCell)TDs[j]).InnerText);
            }

            PageTableDataCache.Add(i, cellsDictionary);
        }

        Dictionary<int, Dictionary<int, string>> ExcelDataCache = GetExcelData(ConfigurationManager.AppSettings["ExcelPath"], "BoxOfficeResults");
        // load mapping
        MappingRow[] mappingRows = GetMappingRowCollection();

        string msg = string.Empty;

        for (int i = 0; i < mappingRows.Length; i++)
        {
            Dictionary<int, string> pageRowCellsDictionary = PageTableDataCache[mappingRows[i].PageTableTrIndex];
            Dictionary<int, string> excelRowCellsDictionary = ExcelDataCache[mappingRows[i].ExcelRowNum];
            MappingColumn[] mappingColumns = mappingRows[i].MappingColumn;
            for (int j = 0; j < mappingColumns.Length; j++)
            {
                string excelValue = excelRowCellsDictionary[mappingColumns[j].ExcelColumnNum];
                string pageValue = pageRowCellsDictionary[mappingColumns[j].PageTableTdIndex];

                Assert.AreEqual(excelValue, pageValue, string.Format("Validation failed at row {0} column {1}", mappingRows[i].ExcelRowNum, mappingColumns[j].ExcelColumnNum));
            }
        }
    }

    private Dictionary<int, Dictionary<int, string>> GetExcelData(string filePath, string sheetName)
    {
        Dictionary<int, Dictionary<int, string>> sheetDataDic = new Dictionary<int, Dictionary<int, string>>();
        Application excel = new Application();
        excel.Visible = false;
        excel.UserControl = true;

        try
        {
            Workbook wb = (Workbook)excel.Application.Workbooks.Open(filePath,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value,
                Missing.Value
                );

            foreach (var worksheet in wb.Worksheets)
            {
                Worksheet ws = ((Worksheet)worksheet);
                if (ws.Name.Equals(sheetName))
                {
                    int rowscount = ws.UsedRange.Cells.Rows.Count;
                    int colscount = ws.UsedRange.Cells.Columns.Count;

                    for (int i = 0; i < rowscount; i++)
                    {
                        Dictionary<int, string> cellsDictionary = new Dictionary<int, string>();
                        for (int j = 0; j < colscount; j++)
                        {
                            Range range = ws.Cells.get_Range(ConvertNumberToName(j) + (i + 1));
                            string cellText = ((object)range.Text) == null ? "" : ((object)range.Text).ToString();
                            cellsDictionary.Add(j, cellText);
                        }
                        sheetDataDic.Add(i, cellsDictionary);
                    }
                    break;
                }
            }
        }
        finally
        {
            excel.Application.Workbooks.Close();
            excel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
            excel = null;
            GC.Collect();
        }

        return sheetDataDic;
    }

    private string ConvertNumberToName(int index)
    {
        if (index < 0) { throw new Exception("invalid parameter"); }

        List<string> chars = new List<string>();
        do
        {
            if (chars.Count > 0) index--;
            chars.Insert(0, ((char)(index % 26 + (int)'A')).ToString());
            index = (int)((index - index % 26) / 26);
        } while (index > 0);

        return String.Join(string.Empty, chars.ToArray());
    }

    private MappingRow[] GetMappingRowCollection()
    {
        Mapping mapping = null;
        MappingRow[] mappingRowCollection = null;

        XmlSerializer serializer = new XmlSerializer(typeof(Mapping));

        using (FileStream fs = new FileStream(ConfigurationManager.AppSettings["MappingsPath"], FileMode.Open))
        {
            using (XmlReader reader = XmlReader.Create(fs))
            {
                mapping = (Mapping)serializer.Deserialize(reader);
            }
        }

        if (mapping != null)
        {
            mappingRowCollection = mapping.MappingRow;
        }

        return mappingRowCollection;
    }
}
  1. 打开浏览器并导航到百度,输加入关贸总协定组织键字“jaxu cnblogs”并点击“百度时而”
  2. 在Coded UI Test Builder窗口中式点心击Add
    assertions按钮并拖放到浏览器窗口,同时指向你想要捕捉的控件上。有个别控件很难精确捕捉到,未有涉嫌,你能够先选中接近的控件,然后选取Coded
    UI Test
    Builder窗口中的方向按钮移动到您所要定位的因素。如下图,大家接纳并一定到了百度查寻结果的DIV成分,并将该控件命名叫UIContent_leftPane。
  3. 在Coded UI Test
    Builder窗口的左上角点击添加选择的控件,那一点很重点!忘记这一步则所挑选的控件不会被添加到生成的代码中。
  4. 浮动代码并关闭Coded UI Test Builder窗口。
[TestMethod]
[DataSource("System.Data.Odbc", @"Dsn=Excel Files;dbq=C:\Box Office Results.xlsx;defaultdir=C:;driverid=1046;maxbuffersize=2048;pagetimeout=5", "BoxOfficeResults$", DataAccessMethod.Sequential)]
public void MyTest()
{
    int rowIndex = this.TestContext.DataRow.Table.Rows.IndexOf(this.TestContext.DataRow);
    string s = this.TestContext.DataRow[0].ToString();
}

 

  即便经过[DataSource]天性属性可以十三分便宜地读取数据源中的数据来形成数据驱动测试,不过有个别景况下那种办法并不适用。思索多个大致的必要:被测试页面上有三个表格,其数据来自服务器上的多个Excel文件。通过编制基于数据驱动测试的Coded
UI Test方法来检查页面上呈现的始末是还是不是与Excel文件一律。

  有少数急需留意:

  下面那段代码表明了这一地方:

[TestMethod]
public void CodedUITestMethod1()
{
    UIMap1 uimap = new UIMap1();
    uimap.RecordedMethod1();

    uimap.TestSearchResult();
}

  UIMap2.uitest中的代码完结了Excel数据与页面Table中的内容比对,并最后通过了测试。但是从严峻意义上来讲,那种景色相应不属于数据驱动测试的规模,数据驱动测试的意义在于通过给定的数量来测试程序已有些职能,而上述处境是由此数据源来比对UI中的内容。可是我们照旧能够从中通晓到怎样编写代码来读取数据源并对Webpage中的表格举办Coded
UI test。

  1. 对Web controls实行查找:SearchProperties和FilterProperties均援救
  2. 对WinForms和WPF controls实行搜索:仅SearchProperties帮衬

图片 1

  (本文演示的拥有代码和操作均在Visual Sutdio 20壹三和Windows 8.1 + IE
1壹环境下)

  1. 读取数据源中的数据并缓存。由于不能够使用[DataSource]性情属性自动读取数据,因而只能本人编写代码来成功数据读取操作。
  2. 找到UI Table实行遍历,将持有单元格的数额缓存。
  3. 将两部分缓存的数据进行比对,那大概供给事先提供Mapping以援救成功数据比对进程。

图片 2

  我们以http://www.cnblogs.com/jaxu/p/3635634.html页面中的表格为例来探视怎么着实现那壹历程。

  查看.Designer.cs文件中自动生成的代码,全数控件的定义都会含有类似于上面代码的检索条件:

  运营方面包车型大巴代码,你会发现实际上数据读取工作是在迭代中做到的。也等于说测试方法会被无休止地迭代,直到数据源中全体行均被读取完结。数据迭代的秘籍可因此枚举DataAccessMethod来钦命,一共三种方法:顺序读取或随意读取。

  1. 搜索会从someAncestorControl控件发轫,因为它被看做要物色控件的先人。注意祖先并不一定是父节点,它可以是被搜寻控件的随意上级控件。
  2. 每1次遍历搜索时,会利用全数已定义的SearchProperties条件实行筛选,要是有几个控件均满足搜索条件,如X壹,X二和X3,此时会持续行使剩下的FilterProperties条件举办筛选。
  3. 对控件X一,X二和X三分别选拔已定义的FilterProperties条件实行筛选,直到匹配到唯一的控件,或然有所的FilterProperties条件均比较达成。

  那里有两篇文章详细描述了怎么通过[DataSource]特色属性来形成多少驱动Coded
UI
Test。其主干思维是通过在TestMethod前面添加[DataSource]特征属性,并点名数据源的项目和地点,然后Coded
UI Test的测试方法在运维时会自动读取数据源中的数据,在迭代中实现比对。

  • 保障程序能够健康运营
  • 对每1个测试方法而言,在那之中会含有五个验证情势,而每1个证实情势中又会蕴藏有三个Assert断言,使用上述情势能够使得管理全部的断言。
  • 自定义测试报告的格式
  • 能够定义测试方法是由此也许失利。战败的测试方法通过Assert.Fail()方法来抛出格外,假诺三个测试方法中从不万分抛出,则会被暗许为测试成功,即使事实上测试是没戏的。

  特征属性[DataSource]有多少个重载,以用来通过分化的法子钦命数据源的岗位。若是你不知晓上述代码中的数据源连接字符串是什么样提供的,能够在Visual
Studio中品尝添加数据源操作,然后拷贝在那之中自动生成的数据源连接字符串。

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </configSections>

  <connectionStrings>
    <add name="MyExcelConn" providerName="System.Data.Odbc" connectionString="Dsn=Excel Files;dbq=C:\Box Office Results.xlsx;defaultdir=C:;driverid=1046;maxbuffersize=2048;pagetimeout=5"/>
  </connectionStrings>
  <microsoft.visualstudio.testtools>
    <dataSources>
      <add name="BoxOfficeResults" connectionString="MyExcelConn" dataTableName="BoxOfficeResults$" dataAccessMethod="Sequential"/>
    </dataSources>
  </microsoft.visualstudio.testtools>
</configuration>

 

  咱们将地方代码中的Excel文件放到C盘根目录,然后调试代码。Excel中的第二行默许会被视作标题,数据暗中认可会从第二行初阶读取,所以首先次迭代的时候DataRow[0]归来的是Excel中A二单元格的始末。TestContext对象被用作数据源上下文,通过它你能够找到数据源的一些性质。例如通过下边代码中的第1行获得到数据源的行索引。那里是msdn上有关DataRow属性的验证http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.testcontext.datarow.aspx

  在上面给出的事例中,会遵从如下顺遂举行搜索:

  上面是UIMap二.uitest中的完整代码:

  AssertWrapper类中的方法能够有多少个重载,以满意不一致的必要,其核心情想就是应用try-catch语句来收获Assert断言所抛出的尤其。TestLog类中的方法负责写测试报告,你能够将测试报告定义成任何款式。然后定义二个TestSettings类用来搜集测试工程中享有的测试断言。

  在那之中有八个public方法:LaunchPage()用来导航到对象页面;TestTableData()用来遍历指标页面上的报表并与数据源Excel中的数据进行比对,给出测试结果。

  工程创设成功后,Visual
Studio会问您是当时起头3个新的UI录像依旧选取已经摄像好的操作。当然你也得以接纳打消,在背后的步子里再开端UI录像。

图片 3

  不要尝试通过GetChildren()方法来遍历全体的控件,因为该措施重临结果会不快,特别是当页面中设有大气控件时。能够运用临近的祖宗节点对该控件进行定义(构造函数的参数能够用来钦赐被搜寻控件的先人),然后通过给定SearchProperties或FilterProperties来对控件实行筛选,然后使用FindMatchingControls()方法来规定要摸索的控件。如下边包车型地铁代码用来遍历Table成分从而找到表中全体的<th/>和<td/>:

  1. 首先遍历页面上的Table,将单元格的情节缓存到字典对象PageTableDataCache中。该字典对象的数码存款和储蓄结构与地方讲到的Excel数据存款和储蓄结构同样。值得注意的是,在遍历Table的长河中由于是遍历Table上边全部HtmlRow的集聚,此处不带有Header部分,由此Table的表尾部分的数据不会被储存到字典对象中。
    图片 4
  2. 由此GetExcelData()方法将Excel中的数据缓存到字典对象ExcelDataCache中。
  3. 添加3个Mapping,用来对页面上的表格和Excel实行映射。为啥需求Mapping?因为页面上表格中单元格的行和列与Excel中的行和列并不一而再各样对应的,所以那里不可不要因而Mapping来展开映射,以鲜明哪些举办比对。Mapping能够是多少个XML文件,在先后中经过反连串化的办法开始展览读取,该操作由个人方法GetMappingRowCollection()完毕。下边是Mapping
    XML文件的内容,有关怎样通过Visual
    Studio自动生成XML反连串化的类,可以查阅那篇文章http://www.cnblogs.com/jaxu/p/3632077.html

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping>
      <MappingRow ExcelRowNum="1" PageTableTrIndex="0">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="2" PageTableTrIndex="1">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="3" PageTableTrIndex="2">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="4" PageTableTrIndex="3">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="5" PageTableTrIndex="4">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="6" PageTableTrIndex="5">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="7" PageTableTrIndex="6">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="8" PageTableTrIndex="7">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="9" PageTableTrIndex="8">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
      <MappingRow ExcelRowNum="10" PageTableTrIndex="9">
        <MappingColumn ExcelColumnNum="0" PageTableTdIndex="0"/>
        <MappingColumn ExcelColumnNum="1" PageTableTdIndex="1"/>
        <MappingColumn ExcelColumnNum="2" PageTableTdIndex="2"/>
        <MappingColumn ExcelColumnNum="3" PageTableTdIndex="3"/>
        <MappingColumn ExcelColumnNum="4" PageTableTdIndex="4"/>
      </MappingRow>
    </Mapping>
    

    同时,由于程序中需求读取Excel文件以及反类别化Mapping
    XML文件,须要在App.config文件中添加三个布局项。

    <appSettings>
      <add key="MappingsPath" value="..\..\..\CodedUITestProject2\Mapping.xml"/>
      <add key="ExcelPath" value="c:\Box Office Results.xlsx"/>
    </appSettings>
    

    留意MappingPath的路径使用的是相对路径,通过将该文件设置为拷贝到输出路径以利于安插。方法是在Visual
    Studio的Solution Explorer中右键选拔该公文->Properties,将Copy to
    Output Directory改成Copy
    always。图片 5

  4. 遍历Mapping中持有行和列,并比较PageTable和Excel中的数据,通过Assert断言来获得测试结果。由于Assert断言在测试失败时总会抛出1二分而止住余下的测试步骤,可以参照文章http://www.cnblogs.com/jaxu/p/3706652.html中有关Assert断言部分对上述代码举办勘误。

  5. 累加测试方法以调用LaunchPage()和TestTableData()
    [TestMethod]
    public void MyTest()
    {
        UIMap2 uimap = new UIMap2();
        uimap.LaunchPage();
        uimap.TestTableData();
    }
    

  至此,全数的UI Actions和UI
Controls都早就定义落成,接下去大家要编码以完成对寻找结果的判定。借助于自动生成的代码,大家编辑了上边包车型客车测试方法以落实文章初步河的测试要求。

[DataSource("BoxOfficeResults")]
[TestMethod]
public void CheckVariousSumResults()
{
    Assert.AreEqual(3, this.Sum(1001, 1, 2));
    Assert.AreEqual(3, this.Sum(1, 1001, 2));
    Assert.AreEqual(3, this.Sum(1, 2, 1001));
}
  1. 在Visual Studio中经过VIEW->Other Windows->Data
    Sources打开数据源窗口
  2. 点击添加2个新的数据源,选用Database
  3. 点击New Connection…在开辟的窗口中通过ODBC格局选用Excel文件,Visual
    Studio会自动为你转移连接字符串
  4. 拷贝该连接字符串

  在Visual Studio中初步创制一个Coded UI Test Project。那很简短!

  本文首要介绍怎样在Coded UI
Test中采用数据驱动测试。思虑那样一个意况:开发职员提交了三个函数,该函数达成了叁个数学公式的运算,通过收到八个数字并拓展数学生运动算给出结果。测试职员根据给定的数学公式,必要思考提供种种不一样情形的值来循环测试该函数。分明,我们供给提供八个数据源,遵照数据源中提供的例外的值来拓展自动化测试。那是最广泛的数码驱动测试的案例。在依据Coded
UI
Test的Webpage自动化测试中,浏览器包容性难题是日常要考虑的,我们能够在数据源(数据源大概是三个记事本或许四个简易的Excel表格)中提供要测试的浏览器的名号和版本号,然后让Coded
UI
Test自动加载分歧的浏览器来循环测试指标页面。上面包车型大巴剧情会介绍那几个办法。

  在Solution
Explorer中开始展览UIMap一.uitest文件,选取并开拓UIMap一.Designer.cs文本,可以看来刚才所生成的代码。是还是不是很想明日就运维一下,来探视那几个自动生成的代码如何运维?以往还相当,因为唯有的UI
Action运营没有别的意义,Coded UI
Test的实在意义是经过UI操作来稳定到UI上的某2个一定成分,并最终通过断言来规定该因素的属性是或不是和预期的值非凡。

  上边包车型地铁代码由Visual
Studio自动生成并做了少量修改(将byte类型改为int),用来将Mapping
XML举办反类别化。

  上面是贰个例证,能够用来有效地消除地点提议的题材。

  将不相同版本的浏览器名称添加到数据源文件中,能够是三个简单的记事本只怕.csv文件,如:

  在Web
controls中,搜索条件的接纳大概会涉及到浏览器包容性难题。如筛选标准最后供给经过InnerText来明确控件,而该属性在好几浏览器上并不协理,此时大概引发那多少个。在先后编码进程中尝试给一定的控件钦定ID属性能够更好的缓解那1题材,那就需求与程序开发职员举办实用的联系。从那点也得以观望,测试驱动开发的主要性。

BrowserWindow.CurrentBrowser = this.TestContext.DataRow[0].ToString();

代码结构调整

  还记得小说一开头波及的利用数据驱动测试来贯彻多浏览器包容性测试呢?我们得以因此下边包车型大巴代码来促成。

  你或然早就注意到了,自动生成的代码中多少对象的名字看起来并不那么好,甚至某个还隐含了华语。你指望修改它们,可是不要在.Designer.cs文件中做其余改动!还记得前边大家讲过的Edit
With Coded UI Test操作吗?在Solution
Explorer中右键接纳UIMap1.uitest文件,右键选拔艾德it With Coded UI
Test打开Coded UI Test Builder窗口,然后点击Add
assertions按钮(就是那多少个用来抉择UI Control的按钮),然后进行UI Control
Map界面。如下图,大家得以对内部变化的UI Controls进行编辑和重命名。

  将数据源连接字符串直接写在代码里并不是什么样明智之举,这有未有哪些点子可以将它移到安排文件中呢?答案是自然的!通过msdn的那篇小说我们能够查出怎么着将数据源连接字符串移到安顿文件中http://msdn.microsoft.com/en-us/library/ms243192.aspx

HtmlTable uITable = this.UIRelWindow.UIRelDocument.UITable;
HtmlRow rowall = new HtmlRow(uITable);

UITestControlCollection rows = rowall.FindMatchingControls();

int rowCount = rows.Count;

for (int i = 0; i < rowCount; i++)
{
    HtmlHeaderCell allTH = new HtmlHeaderCell(rows[i]);
    HtmlCell allTD = new HtmlCell(rows[i]);
    UITestControlCollection THs = allTH.FindMatchingControls();
    UITestControlCollection TDs = allTD.FindMatchingControls();

    ... ...
}

  首先在工程中添加Application Configuration File,即App.config。

图片 6

图片 7

  另一种自小编听到过的消除情势是选取参数化测试,但是据笔者所知,Coded UI
Test中近乎并不援救。在别的测试环境中恐怕有更好的解决办法。

  有关如何是Coded UI Test以及怎样使用Coded UI
Test能够查看本身的另1篇小说:http://www.cnblogs.com/jaxu/p/3706652.html

  在Coded UI
Test中,最普遍的标题是哪些找到被测试的控件。只有找到被测试的靶子,才能接纳断言来判断个中的习性是不是满意预期的值。抢先百分之五十情况下,我们都会动用Coded
UI Test
Builder窗口来捕获UI上的控件,但多少情状下我们只能自行检索须要的控件。1个简单的例子,在列表控件中怎么着寻找第多少个子成分中所包括的文书。就像是本文一开首交付的测试供给。倘使您通过Coded
UI Test
Builder直接搜索第一个子成分,在那之中变化的检索条件往往拥有特定性,当页面包车型大巴尺度发生变化,特定的寻找条件不必然能找到呼应的控件。

  注意microsoft.visualstudio.testtools节中type属性的版本号大概会出于选择的.NET
Framework版本的例外有所变化。二.0为八.0.0.0,三.伍为九.0.0.0,三.5之上应该是拾.0.0.0。在App.config文件中拉长上述配置新闻之后,将测试方法的[DataSource]特征属性改成

[TestMethod]
public void Sum_1001AsFirstParam_Returns3()
{
    Assert.AreEqual(3, this.Sum(1001, 1, 2));
}
[TestMethod]
public void Sum_1001AsMiddleParam_Returns3()
{
    Assert.AreEqual(3, this.Sum(1, 1001, 2));
}
[TestMethod]
public void Sum_1001AsThirdParam_Returns3()
{
    Assert.AreEqual(3, this.Sum(1, 2, 1001));
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Mapping
{

    private MappingRow[] mappingRowField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("MappingRow")]
    public MappingRow[] MappingRow
    {
        get
        {
            return this.mappingRowField;
        }
        set
        {
            this.mappingRowField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MappingRow
{

    private MappingColumn[] mappingColumnField;

    private int excelRowNumField;

    private int pageTableTrIndexField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("MappingColumn")]
    public MappingColumn[] MappingColumn
    {
        get
        {
            return this.mappingColumnField;
        }
        set
        {
            this.mappingColumnField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int ExcelRowNum
    {
        get
        {
            return this.excelRowNumField;
        }
        set
        {
            this.excelRowNumField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int PageTableTrIndex
    {
        get
        {
            return this.pageTableTrIndexField;
        }
        set
        {
            this.pageTableTrIndexField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MappingColumn
{

    private int excelColumnNumField;

    private int pageTableTdIndexField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int ExcelColumnNum
    {
        get
        {
            return this.excelColumnNumField;
        }
        set
        {
            this.excelColumnNumField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int PageTableTdIndex
    {
        get
        {
            return this.pageTableTdIndexField;
        }
        set
        {
            this.pageTableTdIndexField = value;
        }
    }
}

  借用MSDN上的图纸来对Coded UI Test
Builder窗口上按钮的职能做一下简便的表达:

http://blogs.msdn.com/b/mathew_aniyan/archive/2009/03/17/data-driving-coded-ui-tests.aspx

  然后,在有着的测试方法中添加上面包车型客车代码(faillist为泛型List对象,被定义为TestMethod所在的类的私家变量,同时我们由此faillist.AddRange(testPage.faillist)语句将测试页面类中的泛型List内容添加过来):

  由于[DataSource]天性属性是以迭代的主意来拓展多少驱动测试的,因而我们鞭长莫及在数量迭代的进度中去遍历页面UI成分。况且,若是迭代中存在Assert断言,也不太方便大家输出测试结果。最后的冀望是,遍历整个UI
Table,通过与事先读取的数据源中的数据进行依次比对来实现全体育项目检测试,其经过大概是这么:

<configuration>
  <appSettings>
    <add key ="" value=""/>
  </appSettings>
</configuration>

 

HtmlEdit  mUIEmailEdit = new HtmlEdit(someAncestorControl); 
mUIEmailEdit.SearchProperties[HtmlEdit.PropertyNames.Id] = "email"; 
mUIEmailEdit.SearchProperties[HtmlEdit.PropertyNames.Name] = "email"; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.LabeledBy] = null; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.Type] = "SINGLELINE"; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.Title] = null; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.Class] = null; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.ControlDefinition] = "id=email size=25 name=email"; 
mUIEmailEdit.FilterProperties[HtmlEdit.PropertyNames.TagInstance] = "7";

mUIEmailEdit.Find();

图片 8

  但是,Assert断言总会在测试战败的时候抛出拾贰分,从而终止程序运营。如上面包车型客车测试方法,倘若前七个断言中有其余五个波折以来,则剩下的断言不会被实施。

http://msdn.microsoft.com/en-us/library/ms182527.aspx

public static class AssertWrapper
{
    public static string AreEqual<T>(T expected, T actual, string message)
    {
        string result = null;
        try
        {
            Assert.AreEqual(expected, actual, message);
            TestLog.WritePass(message);
        }
        catch (AssertFailedException ex)
        {
            result = ex.Message;
            TestLog.WriteError(message);
        }
        catch (Exception ex)
        {
            result = ex.Message;
            TestLog.WriteError(message);
        }
        return result;
    }

    public static string AreEqual(string expected, string actual, string message)
    {
        string result = null;
        try
        {
            Assert.AreEqual(expected, actual, message);
            TestLog.WritePass(message);

        }
        catch (AssertFailedException ex)
        {
            result = ex.Message;
            TestLog.WriteError(result);
        }
        catch (Exception ex)
        {
            result = ex.Message;
            TestLog.WriteError(result);
        }
        return result;
    }

    public static string AreEqual(string expected, string actual, bool ignorecase, string message)
    {
        string result = null;
        try
        {
            Assert.AreEqual(expected, actual, ignorecase, message);
            TestLog.WritePass(message);

        }
        catch (AssertFailedException ex)
        {
            result = ex.Message;
            TestLog.WriteError(result);
        }
        catch (Exception ex)
        {
            result = ex.Message;
            TestLog.WriteError(result);
        }
        return result;
    }

    public static string Fail(string message)
    {
        string result = null;
        try
        {
            Assert.Fail(message);
        }
        catch (AssertFailedException ex)
        {
            result = ex.Message;
            TestLog.WriteError(result);
        }
        return result;
    }
}

  在TestTableData()方法中,壹共完结了多个步骤:

  1. 编写翻译Coded UI Test工程,将扭转的.dll文件复制到钦赐的目录下。
  2. 开拓Windows命令行窗口,转到目录c:\Program Files (x86)\Microsoft
    Visual Studio 12.0\Common7\IDE
    抑或直接打开Developer Command Prompt for VS二零一二
  3. 选取如下命令行执行测试方法

    MSTest /testcontainer:CodedUITestProject2.dll /test:CodedUITest1.CodedUITestMethod1

图片 9

图片 10

  若是Excel文件中存在多个表,则能够在配备文件的<dataSources>中添加五个<add>节点,指明分裂的数据表名称和数据读取方式。

  • Record icon – 开端多个UI操作的摄像。例如菜单导航、按钮点击等操作。
  • 艾德it steps – 对摄像的步调举办编制,调整还是去除冗余的步子。
  • Add assertions –
    不仅仅是添加断言,通过点击该按钮并拖放到测试对象的UI上以挑选控件,然后你能够添加断言。
  • Generate code –
    这一步很要紧,在成功上述全体的操作后,通过点击该按钮Visual
    Studio会自动为你转移代码。生成的代码在.uitest文件下边的.Desinger.cs文件中得以见见。留神不要手动修改自动生成的代码,那会造成下次因此Coded
    UI Test Builder窗口对.uitest文件进行修改时或多或少对象或操作不联合。
  • Close to finish recoding – 在关门Coded UI Test
    Builder窗口往日,确定保障所做的改动已经转移了相应的代码。假设要修改.Designer.cs文件中自动生成的代码,能够在Solution
    Explorer中右键选用.uitest文件,然后选择Edit With Coded UI Test
    Builder。在背后的步骤中大家会讲到那或多或少。

图片 11

图片 12

public class TestRunner
{
    public TestRunner()
    {
        homePage = new UI.HomePageClasses.HomePage();
    }


    #region Home page actions and validate method

    private UI.HomePageClasses.HomePage homePage;
    public UI.PageClasses.HomePage HomePage
    {
        get
        {
            if ((this.homePage == null))
            {
                this.homePage = new UI.PageClasses.HomePage();
            }
            return this.homePage;
        }
        set
        {
            homePage = value;
        }
    }

    public void LaunchHomePage()
    {
        HomePage.LaunchHomePage(new System.Uri(TestSettings.GetCurrentSiteURL()));
    }
    public void ValidateHomePageText()
    {
        HomePage.ValidateHomePageText();
    }
}

  在自动化测试中,Assert断言1旦相遇测试失利的事态就会抛出相当,从而造成接下去的测试方法或任务不会继续执行。也便是说,借使1个测试工程中富含了许多测试方法,常常的情况是一个测试工程中会包括很四个测试类,每种类针对分化的测试用例,而各类测试类中又包蕴了广大个不等的测试方法。面对如此小幅度的贰个测试工程,经常会花上数10分钟甚至数钟头才能将预定好的拥有测试方法跑完,我们自然不愿意见到由于某一个测试方法失利而致使剩下的全部测试方法均不可能博取实施。在自动化测试中,测试方法测试失败的情状是很宽泛的,成功或失利都以一种结果,这总比程序运转到四分之二抛出非凡要好得多。

图片 13

[TestMethod]
public void IncomeStatementsTest()
{
    testrunner.NavigateToTestPage();
    testrunner.ValidateSomething();
}

[TestInitialize()]
public void MyTestInitialize()
{
    testrunner = new TestRunner();
    testrunner.LaunchHomePage();
}

////Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup()
{
    testrunner = null;
}

private TestRunner testrunner;

  Coded UI
Test包罗了11分抬高的API库,它能够摄像和回看UI操作,捕捉UI成分并取得属性的值,并生成操作代码。测试职员在风谲云诡代码的根基上对测试对象的值进行逻辑判断并交付测试结果。成立1个Coded
UI Test很简单,大部分景色下,大家只要求借助Visual
Studio就足以成功绝大多数操作。为了印证1切操作进度,大家固然八个测试要求:

  为了能够手动修改.Designder.cs文件中变化的代码,大家须求将它们移到.cs文件中。在Solution
Explorer中双击UIMap一.uitest文件,在开辟的窗口中大家能够看来左侧是UI
Actions所生成的手续,左侧是UI Control
Map(稍后我们会用到它)。在左侧的UI
Actions中选拔根节点RecordedMethod一,然后在顶部的菜单中选用Move code to
UIMap壹.cs,代码会被移到.cs文件以有益大家举办修改。达成该手续之后,我们得以在.cs文件中看出那几个代码并做相应的修改。

  然后我们须求捕捉到百度搜索结果的UI控件,并对内部的结果开始展览判断。如故使用Coded
UI Test Builder窗口。

  也许能够利用try-catch语句来收获Assert断言所抛出的不行,使程序能够持续运营下去。然后我们将有所截获到的不得了音信输出到自定义的文书中,即自定义测试报告!测试报告能够是自由档次的文书档案,记事本或HTML比较常用。既然能够使用try-catch来收获Assert断言的特别欢悦,那么大家会很自然地想到利用上面包车型大巴办法:

  下边包车型大巴流程图表明了这一历程:

  达成修改之后再一次点击Generate code按钮并关闭Coded UI Test
Builder窗口,此时.Designer.cs文件中自动生成的代码已经做了修改。由于前边大家早就将有关的UI
Actions部分的代码移到.cs文件里了,所以重命名的指标大家还亟需在.cs文件中手动进行改动,不然编译时会出错。提议在将代码移到.cs文件之前到位自动生成代码的改动工作,以制止手动修改过多的代码。

  msdn.aspx)上有对MSTest.exe命令行全部参数的证实。有几点必要验证一下:

  在Visual Studio中,Coded UI
Test已经不是何许新特点了,较早版本的Visual
Studio中就早已有这一个东东了。它最首要用来赞助自动化测试工程师和开发人员确定保证程序在UI方面并未有其它难点。这其中富含了增进的始末。在那前边,小编一贯对自动化测试的工作以及怎么着是自动化测试一知半解,具备自动化测试编码能力的工程师所控制的技术在某种程度上要远超程序开发人士和规划职员,对于那或多或少,笔者早有听闻!但直到亲身体会自身才确信,测试工作远未有大家想像得那么不难。开发职员大概花上数时辰就能够成功项目中某贰个独立模块并使其在肯定限制内符合规律运作,但是,自动化测试工程师大概会花上有个别天的命宫来编排对应的自动化测试代码来保管那1效应运营符合规律化。

有关Assert断言

基本操作

 

图片 14

  上面包车型大巴代码能够很实用地缓解难点,但仍会设有毛病。MultiAssert.Aggreate()方法中过多的断言最终会将全部的不得了音信抛出,那会大大下降非凡音讯的可读性,不太便宜大家从测试测试报告中剖析失误的原委。要清楚,测试方法最终的目标不是要让测试程序运营通过,而是经过测试报告来分析被测试目的只怕持有的题材。

  那样,可以对该测试方法中隐含的富有Assert断言举行合并保管。那样做有多少个便宜:

@echo off

@set PATH=c:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE;%PATH%

echo ****** This program will start a Coded UI Test Method ******
pause

MSTest /testcontainer:CodedUITest1.dll /test:CodedUITest1.CodedUITestMethod1

echo ****** End Coded UI Test Method ********


pause

 

  在每1个.uitest文件的类中,那样使用方面的法门:

  今后得以因此Test
Explorer窗口只怕直接行使测试方法的上下文菜单运营或调节和测试该测试方法。若是因此测试,测试方法后面会显得驼色的图标,不然会来得古金色的叉。Visual
Studio会为每回测试生成对应的测试报告,在工程目录下的TestResults文件夹中能够找到全部的测试报告。

图片 15

  3个立见功效的化解办法是将每四个预感分别放到分裂的测试方法中,如下面包车型地铁代码:

[TestMethod]
public void CheckVariousSumResults()
{
    MultiAssert.Aggregate(
        () => Assert.AreEqual(3, this.Sum(1001, 1, 2)), 
        () => Assert.AreEqual(3, this.Sum(1, 1001, 2)), 
        () => Assert.AreEqual(3, this.Sum(1, 2, 1001)));
}

public static class MultiAssert
{
    public static void Aggregate(params Action[] actions)
    {
        var exceptions = new List<AssertFailedException>();

        foreach (var action in actions)
        {
            try
            {
                action();
            }
            catch (AssertFailedException ex)
            {
                exceptions.Add(ex);
            }
        }

        var assertionTexts = 
            exceptions.Select(assertFailedException => assertFailedException.Message);
        if (0 != assertionTexts.Count())
        {
            throw new
                AssertFailedException(
                assertionTexts.Aggregate(
                    (aggregatedMessage, next) => aggregatedMessage + Environment.NewLine + next));
        }
    }
}

  除了在Visual
Studio中运维测试方法外,大家还是可以够经过别的众多措施来运维测试方法。使用测试代理和测试控制器能够对富有的测试方法实行有效管理,并得以将测试方法分发到分裂的测试机上单独实行测试,但须要在服务器上进行计划,MSDN上有相应的牵线,那里关键介绍怎么样通过命令行格局来运作测试方法。

  大多数代码是由Coded UI Test
Builder自动生成的,大家只编写了TestSearchResult()方法,用来寻觅控件并得到到个中的值来开始展览判定。测试结果的判断通过Assert断言来实现,Assert提供了多样办法以帮忙我们兑现差异的判定,具体的始末能够参考msdn。然后对RecordedMethod壹()方法做了确切修改。TestSearchResult()方法中对此什么寻找和遍历UI控件在稍后的章节中会切磋到。然后我们将装有代码的调用放到CodedUITest1.cs文本中举行。

  忘记表达某个,带有[CodedUITest]本性属性的类中,大家得以借用MyTestInitialize()方法和MyTestCleanup()方法进行1些伊始化操作和清理工科作。不要在此类的构造函数中丰盛任何代码,通过带有[TestInitialize]特点属性的办法开始展览初叶化工作。同样,带有[TestCleanup]特征属性的诀要能够用来开始展览1些清理工科作。

  工程暗许生成CodedUITest1.cs文本。在开端录像UI操作在此以前,对基本概念做一下介绍:

  不过在超越一半景观下那恐怕不算。例如你需求测试一个带有十0行的table,对每壹行的title列进行text测试,在那种情况下您根本不能够为每1个预知编写不一致的测试方法。首先你不只怕鲜明测试方法的多少,其次过多的测试方法会增多尊崇开支。

图片 16

public List<string> faillist;

public void ValidateHeader()
{
    TestSettings.AddResult(faillist,AssertWrapper.AreEqual(true, uIHeader.Exists, "test page: Validate Page header text"));
}

  然后,我们开头三个UI摄像。在工程中添加一个Coded UI Test
Map文件。成立成功后Visual Studio会自动在显示屏的右下角打开Coded UI Test
Builder窗口,以便于大家开始展览UI录像操作。

  1. Coded UI
    Test工程的运作是从包括有[CodedUITest]特点属性的类早先的。一个工程中可以有四个这么的类。
  2. 与常见的工程不相同,大家无法透过F伍恐怕点击Visual
    Studio中的运转按钮来调节或直接运行工程,Coded UI
    Test工程必须经过Test
    Explorer或许在含蓄有[CodedUITest]天性属性的类中来摘取运转相应的测试方法。
  3. 在带有[CodedUITest]特点属性的类中,全体的测试方法都必须带有[TestMethod]特点属性,以象征它是五个一蹴而就的测试方法,能够直接运维。
  4. 透过选用TEST->Windows->Test Explorer能够打开Test
    Explorer窗口,在Test
    Explorer窗口中得以查看工程中具备的测试方法并接纳运维。当然,你也能够在富含[TestMethod]特征属性的测试方法的代码块中右键选用运转该测试方法。
  5. 测试方法同样能够调剂。在甄选运转测试方法时,你会看到有Debug
    Test的菜谱,调节和测试的历程和在普通工程中1样。

  假诺您想分发你的测试工程在任何机器上运转,能够编写.bat文件并将Coded
UI
Test工程生成的.dll文件放到同一文件夹下。.bat文件的始末看起来像上边那样:

图片 17

  • /testcontainer中有至关重要钦点.dll文件的路线名称
  • /test用来钦命.dll文件中所包涵的测试方法的全名称。注意那里的真名称包蕴了测试方法所在的类名以及艺术名,类必须含有[CodedUITest]特点属性,测试方法必须含有[TestMethod]特色属性。

  .uitest文件针对的是每个测试页面,每一个页面都有独立的求证措施用来测试页面上各类分裂的1些,具有得天独厚结构的代码能够使整个测试工程看起来思路清晰。如若有必不可缺,你一点①滴能够应用设计格局来一发简便易行地组织工程中的测试方法和类。1个完全的测试工程代码结构看起来像那样:

  UI Action的摄像和UI控件的选料操作是分离的。让我们先起来UI
Action的摄像。

  使用TestRunner类将工程中具有的辨证措施和UI
Actions方法进行李包裹装,然后在测试方法中展开调用。

  Coded UI
Test会试图通过具有已知的准绳来寻找钦赐的控件,它应用广度优先查找方法(Breadth-First)。全数SearchProperties能够被视为使用AND条件实行搜寻,固然经过SearhProperties找到二个或未找到对应的控件,则持有的FilterProperties条件不会被选用。假使通过装有的SearchProperties条件找到多少个照应的控件,则尝试各个应用给出的FilterProperties条件举行按序匹配(Ordered
match),直到找到匹配的控件。借使通过以上给出的持有规则最后找到多余1个的匹配项,则率先个相当的成分即为找到的控件。

  其余,和超越四分之二工程一律,Coded UI
Test工程允许选用App.config文件。在工程中添加该文件并出席<appSettings></appSettings>节点以设置配置消息。

 

  1. 点击Coded UI Test Builder窗口中的深紫红按钮
  2. 打开IE浏览器,在地点栏中输入http://www.baidu.com以导航到百度搜索引擎
  3. 输加入关贸总协定组织键字“jaxu cnblogs”,点击“百度时而”
  4. 在Coded UI Test Builder窗口中点击Pause,然后点击艾德it
    steps,删除不要求的步子。作者删除了操作中的第伍步和第五步。
  5. 慎选Generate code,对所要生成的法子取个名字,然后点击Add and
    Generate按钮。Visual
    Studio为大家所录像的UI操作步骤生成了相应的代码。
  6. 闭馆Coded UI Test Builder窗口,在Visual Studio中查看刚才生成的代码。
在浏览器中打开百度搜索,输入“jaxu cnblogs”关键字,搜索并查看结果的第一条是否为“Jaxu - 博客园”

图片 18

相关文章