自动化测试系列之二:使用SpecFlow+Selenium框架在Visual Studio上写自动化测试脚本

系列链接

自动化测试系列之一:使用SpecFlow+Selenium框架之理论介绍

自动化测试系列之二:使用SpecFlow+Selenium框架在Visual Studio上写自动化测试脚本

自动化测试系列之三:使用Katalon Recorder自动生成基于Selenium框架的测试代码

 

目的

SpecFlow框架用于管理所有的Test Case, Selenium框架用于完成自动化测试。

前提条件

安装好Vistual Studio

准备环境

点击上面的Tools->Extensions and Updates,弹出来框,搜索specflow,安装以下插件。

创建一个测试项目

首先创建一个测试项目,安装SpecFlow的依赖包,然后创建第一个SpecFlow文件,让它能正常的运行起来。

创建一个Unit Test Project项目,如下图。

右键点击Manage NuGet Packages

 输入SpecRun.SpecFlow,并安装此依赖包

删除UnitTest1.cs, 因为我们不是要写单元测试,然后创建两个新文件夹命名为Features和StepDefinitions,然后增加一个文件

 然后你选择第一个文件,并命名为CalcDemo

 生成的文件看起来像这个样子。

 

 一般来说,一个SpecFlow Feature 文件就对应一个Test Case, 在上图的Feature(2-4行)需要写出这个Test Case的功能描述。后面Scenario(7-11行)需要写出测试这个Test Case的实际步骤,一个Test Case通常被描述成"通过一些参数的输入,执行某个或某些方法后,得到什么样的结果",Given, And When, Then这些关键字帮助我们很好的描述了这一步骤,Given, And代表你输入的参数,When 代表当执行某个或某些方法,Then代表得出的结果,并验证这个结果是否正确。

了解以上基本知识后,我们来做一个Demo,这个Test Case是"通过输入两个参数,执行加法,最后得到结果,并验证这个结果是否正确",接下来我们要对它进行修改。最后改成下面这样,以下内容都是纯手工输入的,然后右键点击此内容,弹出如下框,并点击GenerateS Step Definitions。

(注:这里Outline和Examples 是成对出现的,Examples 下面就是需要转入的参数的集合,如果这里的参数的集合非常多的话,可以使用Excel,这里先不作介绍)。

弹出如下框

点击Generate后直接点击保存,它会保存到我们刚创建的StepDefinitions文件夹,最后得到的如下面这个样子

可以看出上面4个方法就是刚才定义步骤的具体实现,更改代码如下,在类里面先定义三个变量,在Given中将两个参数赋值,在When里写出具体的逻辑(即实际的加法方法),在Then里进行断言,判断期望的值是否与实际算出来的值是否相等,如果相等则此TestCase通过,否则不通过。

右键点击AutoTest.Specs项目,点击build对此项目进行编译。然后在导航栏上选择Test->Windows->Test Explorer,出现左侧的窗口,我们在这里可以运行我刚写的测试。 

为什么要先编译? 因为Test Explorer是通过AutoTest.Specs.dll发现有多少TestCase的,通过编译可以生成AutoTest.Specs.dll。

你可以点击Run All,可以单击某一条Test,右键点击Run Selected Tests,这里我选择Run All ,最后这两个Test都会运行成功。

运行完成后,点击View->Output,如下窗口中的链接可以看到完整的Report和Log.

到这里,我们的第一个SpecFlow项目就正式运行啦,接下来我们要将Selenium框架集成进去。

集成Selenium框架

Selenium框架才是我们搞自动化测试的核心,接下来尝试写一个Demo,Selenium 自动打开Chrome浏览器,输入百度的网址,输入Hello Word并搜索,并显示所有的查询结果。

新建一个SpecFlow Feature 文件

右击Features文件->Add->New Item...->SpecFlowFeature.feature,命名为BaiduDemo.feature,并且将内容改为如下。

右击GenerateS Step Definitions,产生Step文件。

将Selenium包引入,右击AutoTest.Specs->Manage Nuget Packages...->Brower,搜索Selenium.WebDriver并安装。然后更改BaiduDemoSteps.cs文件,内容如下:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using TechTalk.SpecFlow;

namespace AutoTest.Specs.StepDefinitions
{
    [Binding]
    public class BaiduDemoSteps
    {
        [Given(@"这里没有参数要输入,所以随便写写")]
        public void Given这里没有参数要输入所以随便写写()
        {
            //ScenarioContext.Current.Pending();
        }
        
        [When(@"打开Chrome浏览,输入百度的网址,输入Hello Word并搜索,并显示所有的查询结果,点击第一个查询结果""(.*)"",弹出一个新的TAB,在新的TAB页中,给百度百科词条投一票")]
        public void When打开Chrome浏览输入百度的网址输入HelloWord并搜索并显示所有的查询结果点击第一个查询结果弹出一个新的TAB在新的TAB页中给百度百科词条投一票(string p0)
        {
            IWebDriver driver = new ChromeDriver();
            string url = "https://www.baidu.com/";
            driver.Url = url;

            driver.Manage().Window.Maximize(); //放大浏览器

            Thread.Sleep(2000); //等待2秒

            driver.FindElement(By.Id("kw")).SendKeys("Hello World!");

            Thread.Sleep(2000); //等待2秒

            IWebElement searchButton = driver.FindElement(By.Id("su"));

            searchButton.Click(); //点击搜索,会显示查询的列表

            Thread.Sleep(2000); //等待2秒

            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);  //等待5秒

            var theFirstLink = driver.FindElement(By.Id("1"));  //hello world_百度百科

            theFirstLink.FindElement(By.TagName("a")).Click(); // 点击 hello world_百度百科, 将会打开一个新的页面

            //driver.SwitchTo().ActiveElement();

            Thread.Sleep(5000); //停5秒 等等被打开的页面加载完 

            List<string> handlers = new List<string>();
            foreach (string handle in driver.WindowHandles)
            {
                //判断哪一个是被打开的页面
                //假定当前页面排在第一位,被打开的页面排在第二位
                handlers.Add(handle);

            }
            driver.SwitchTo().Window(handlers.ElementAt(1)); //定位到新打开的页面

            var voteLink = driver.FindElement(By.Id("j-top-vote")); //找到投票按钮

            voteLink.Click(); //给它投一票


            Thread.Sleep(10000); // 等10秒后

            driver.Close(); //关闭浏览器
            driver.Quit(); //退出web driver
        }
        
        [Then(@"这里也没有判断结果,所以随便写写")]
        public void Then这里也没有判断结果所以随便写写()
        {
            //ScenarioContext.Current.Pending();
        }
    }
}

 这里有代码,测试人员上手可能会有点难度,但只要学习和练习,跨过这个槛就好了。代码中有比较详细的注释,这里涉及到C#的用法及Selenium的用法,需要单独去学习,最后测试出来的效果如下截图。

 Test Explorer 窗口中也是显示此测试成功通过。

源码地址

木有

相关链接

https://specflow.org/getting-started/

https://specflow.org/plus/excel/getting-started/

http://toolsqa.com/selenium-webdriver/c-sharp/set-up-selenium-webdriver-with-visual-studio-in-c/

总结与讨论

本文介绍了使用SpecFlow+Selenium框架写自动化脚本的一个小例子,但对测试人员来说,上手是有一定门槛的,因为需要写代码。还有以下问题待解决。

  • 希望能解决测试人员不需要写代码或写尽可能少量的代码就能够完成自动化测试,能否有这样一个插件,测试人员在浏览器上正常手工测试,这个插件会记录测试人员的动作自动生成相应的代码,再此代码加入到刚才的项目中呢,有人提议用Selenium IDE,还有人提议用UFT,这个就是以前HP的QTP(商用软件,很贵但易上手)。
  • 当测试用例较多的时候,可以使用SpecFlow Excel插件
  • Selenium框架更进一步的使用

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值