美文网首页Testing
Cypress 自动化测试 (一)

Cypress 自动化测试 (一)

作者: 爱sa笑的菇凉 | 来源:发表于2020-01-16 12:21 被阅读0次

    0.Cypress是什么?

    cypress 是一个端到端(end to end) 测试框架。Cypress 是前端测试市场的新生力量,在测试人员和开发人员中越来越受欢迎,它可以测试浏览器中运行的任何内容。官方地址: https://www.cypress.io/

    通常大家都会以为Cypress就是Selenium;Cypress从底层和结构上都不同于Selenium,Selenium通过网络执行远程命令,而Cypress与您的应用程序在同一运行循环中运行。和Selenium相比,Cypress安装简单而且免费,编写用例简单,测试速度更快。


    1.Cypress 环境搭建

    1.1 本地创建文件夹 CypressDemo
    1.2 在VS Code中打开CypressDemo文件夹
    1.3 打开VS Code 的 Terminal,运行npm init 初始化项目,初始化时,package name 等信息可以不用填写,回车就行。最后选择Yes,然后确保生成node_modules文件夹或者生成package.json文件
    1.4 继续在 Terminal 中运行下边命令安装 cypress

    npm install cypress --save-dev
    

    1.5 安装完成后,cypress 已经在 ./node_modules 目录下,但需要通过下边的命令打开 cypress 的GUI,只有打开GUI之后,在项目中才能看到Cypress的文件夹。

    node_modules/.bin/cypress open
    

    1.6 生成 Cypress 文件夹后,看看整体项目的文件结构:
    -- Cypress
        -- fixtures              测试数据的配置文件,可以使用fixture方法读取
        -- integration           测试文件所存放的路径
        -- plugin                插件文件的路径,默认在index.js中
        -- support               加载测试文件之前要加载的文件路径,这个文件被编译并绑定
        -- screenshots           存放失败的用例的截图文件 (这个在执行测试时cypress会自动生成)
        -- videos                存放测试用例执行的视频(这个在执行测试时cypress会自动生成)
    -- cypress.json              cypress的全局配置文件
    -- package.json              存放项目的所有文件的目录
    

    2.Cypress 常用方法

    在编写测试用例之前,我们可以先了解一下Cypress的一些基本语法:

    2.1. 用例集的方法
    1. reference - 表示告诉VSCode要去 cypress package里找相关的语义解析,这样一来cypress相关的语法和函数等就可以尽情地使用了;
    2. describe() - 声明了一个测试用例集,是Mocha中将测试分组的一种方法。describe()带有两个参数,第一个是测试组的名称,第二个是回调函数;
    3. it() - 声明了一个测试用例,it()有两个参数,一个参数是一个字符串,说明测试应该做什么,第二个参数是一个包含实际测试的回调函数;
    4. it.only() - 代表只测试这个case;
    5. it.skip() - 代表不要测试这个case;
    2.2. 钩子
    1. before() - 在每个测试用例集执行前要做的事;
    2. after() - 在每个测试用例集执行完要做的事;
    3. beforeEach() - 在每个测试用例运行前需要做的事;
    4. afterEach() - 在每个测试用例运行前需要做的事;
    2.3. 基本操作
    1. cy.visit(url) -- 访问URL
    2. cy.url() -- 获取当前URL的地址
    3. cy.go(direction) -- 返回前或者后一个页面 "forward", "back"
    4. cy.get() - 获取元素, 接受一个CSS选择器来选择一个或多个元素
    5. cy.contains() - 可以通过元素的内容而不是 CSS 选择器来查找一个元素
    6. cy.get('selector').click() - 点击元素,需要跟在查找元素表达式的后面
    7. cy.get('selector').dbclick() - 双击元素,需要跟在查找元素表达式的后面
    8. cy.get('selector').type(String) - 可以再输入框中输入一段内容,也需要跟在查找元素表达式的后面
    9. cy.get('selector').should() - 验证
    10. cy.get('selector').clear() - 清楚文本框中的内容
    cy.visit("http://jianshu.com")
    cy.url().should('include', 'jianshu')
    cy.go("back")
    cy.get('nav').should('be.visible')
    cy.contains('apples')
    cy.get('nav').click();
    cy.get('nav').type("search")
    cy.get('nav').should('have.attr', 'href', '/users')
    cy.get('#app div:nth(0)').should('contain', 'first child')  
    

    3.执行测试

    编写完测试用例,测试用例主要存放在integration文件夹中,讲解项目结构中也有提到。而且Cypress自带了很多测试脚本的案例,也可以进行学习。测试用例编写完了,那么如何来执行测试用例呢?

    3.1. 通过GUI来选择要执行的测试用例

    使用node_modules/.bin/cypress open命令可以打开GUI,选择想要执行的用例来执行。

    但是如果每次通过执行完整的路径打开 cypress 就比较麻烦,我们可以添加脚本 "cypress:open": "cypress open"在 package.json 文件的 scripts 区域,然后执行 npm run cypress:open 命令就可以打开GUI,比较方便。如下代码:

    {
      "name": "cypressdemo",
      "main": "index.js",
      "scripts": {
        "cypress:open": "cypress open"
      },
      "license": "ISC",
      "devDependencies": {
        "cypress": "^4.5.0"
      }
    }
    
    3.2. 使用命令来运行测试 (Headless模式)

    Cypress默认是使用headless模式运行测试用例的,所以不会看到打开浏览器的界面。

    npx cypress run      
     //运行所有的测试用例
    
    npx cypress run --spec cypress/integration/examples/actions.spec.js  
    //运行单个js文件里的测试用例
    
    npx cypress run --spec “cypress/integration/examples/actions.spec.js,cypress/integration/examples/aliasing.spec.js” 
    //运行多个js文件里的测试用例
    

    注意:多个js文件时,中间不能有空格,否则只执行第一个js文件里的case

    npx cypress run --spec “cypress/integration/examples/**/*” 
    //运行测文件夹里的所有用例
    
    3.3. 使用命令打开页面运行测试
    npx cypress run  --headed    
    //--headed 可以打开浏览器看到测试用例的执行
    
    3.4. 选择在哪个浏览器执行
    npx cypress run  --browser chrome    
    //--browser可以选择执行的浏览器
    

    4.生成报告

    一般使用 npx cypress run --spec cypress/integration/examples/actions.spec.js 命令运行测试用例,cypress会生成两个文件夹,一个是screenshots用来存放失败的截图,一个是videos用来存放每条用例的录屏。

    但是执行完之后没有测试报告,需要给Cypress项目设置报告。因为cypress是基于mocha.js,所以Mocha的所有Report都可以使用, 所以接下来我们可以用mochawesome给Cypress项目生成一个带有截图的HTML报告

    4.1. 生成json报告

    A. 首先安装mocha cypress-multi-reporters mochawesome

    npm install --save-dev mocha cypress-multi-reporters mochawesome
    

    B. 安装完成后在cypress.json文件中添加下边的代码:
         a. reporter: 指定报告生成器 mochawesome
         b. reportDir: 指定报告存放路径,不指定默认在项目目录下mochawesome-report
         c. overwrite: 是否覆盖原来的报告,选择“true”的话,如果有多个case文件,第二个文件的报告会覆盖第一个的报告,以此类推,最终只有最后一个用例的报告
         d. html: 是否生成html报告
         e. json: 是否生成json文件

        "reporter": "cypress-multi-reporters",
        "reporterOptions": {
            "reporterEnabled": "mochawesome",
            "mochawesomeReporterOptions": {
                "reportDir": "cypress/results/json",
                "overwrite": false,
                "html": false,
                "json": true
            }
        }
    

    C. 配置完成后执行测试用例,就会生成一个results和json的文件夹,里边会生成mochawesome.json , mochawesome_001.json的json文件。

    4.2. Merge多个json文件

    首先,安装merge报告的工具

    npm i --save-dev mochawesome-merge
    

    执行代码,将多个json文件merge成一个json文件

    npx mochawesome-merge cypress/results/json > cypress/results/mochawesome.json 
    
    4.3. 将生成的json文件转换为html文件

    首先,安装生成html文件的工具

    npm i --save-dev mochawesome-report-generator
    

    执行下边代码,将合成的json文件转换成一个HTML文件

    npx marge cypress/results/mochawesome.json  -o cypress/results 
    
    4.4. 查看报告

    在cypress/results 文件下,就可以看到HTML的报告,打开如下图所示,但是没有失败的截图。

    4.5. 给报告中添加失败用例的截图

    Cypress会自动生成一个screenshots文件夹,里边的截图会按照case文件夹/case所在spec.js文件名字/context名字/case名字.png 格式存放,根据这个,我们可以在support/index.js 文件中添加下边代码,引入截图。

    import addContext from 'mochawesome/addContext'
    
    Cypress.on("test:after:run", (test, runnable) => {
        if (test.state === "failed") {
            let item = runnable
            const nameParts = [runnable.title]
    
            // Iterate through all parents and grab the titles
            while (item.parent) {
                nameParts.unshift(item.parent.title)
                item = item.parent
            }
    
            const fullTestName = nameParts
                .filter(Boolean)
                .join(' -- ')           
                // this is how cypress joins the test title fragments
    
            const imageUrl = `../screenshots/${
                Cypress.spec.name
                }/${fullTestName} (failed).png`
    
            addContext({ test }, imageUrl);
        }
    });
    

    结果如下:

    至此,再运行用例,合并json文件,转换成HTML,打开HTML文件就能看到失败的截图了。 参考: 3 Steps to Awesome Test Reports with Cypress

    5.与 Pipeline 集成

    这里使用GoCD进行部署,关于GoCD相关信息,可以查看 GoCD相关配置

    5.1 创建pipeline
    5.2 添加Task
    • Task1: 安装cypress-multi-reporters mochawesome
    • Task2: 安装mochawesome-merge
    • Task3: 安装mochawesome-report-generator
    • Task4: 运行测试
    • Task5: 合并json文件
    • Task6: 生成HTML报告
    5.3 获取产出物(Artifacts)

    将生成的HTML文件显示在TestResults tab中:

    相关文章

      网友评论

        本文标题:Cypress 自动化测试 (一)

        本文链接:https://www.haomeiwen.com/subject/nhhtactx.html