前端实现端到端测试(代码版)

这篇具有很好参考价值的文章主要介绍了前端实现端到端测试(代码版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

端到端测试框架选取

  • playwright 、 cypress 、 selenium 对比
    • 个人初步使用后,推荐playwright 框架作为e2e test

cypress使用

  • 下载 cypress
    • npm install cypress --save-dev
  • package.json
    • npm run cypress:open
    {
      "scripts": {
        "cypress:open": "cypress open"
      }
    }
    

使用流程

  • 入门官方文档
  1. npm run cypress:open

  2. 左侧端测试,右侧组件测试,点击左侧前端实现端到端测试(代码版)

  3. 选择你需要的浏览器,点击开始前端实现端到端测试(代码版)

  4. 自动打开浏览器,点击左侧specs(测试文件菜单),点击内容区域.cy.ts文件
    前端实现端到端测试(代码版)

  5. 左侧是测试执行栏,会有每个指令的详细信息以及成功失败,箭头可以点开看详细信息. 右侧是内容显示栏会有页面显示前端实现端到端测试(代码版)

code

  • 每次it测试,触发窗口大小变化,然后登录,第一次会正常执行,然后保存登录状态,cy.session再次触发,如果登录过,会直接跳过
  • 指令解析
    • cy.visit 访问地址
    • cy.origin 如果登录地址会先跳到一个login登录链接,登录完成再次回到业务链接时,域变化,需要加origin指令
    • cy.get 得到dom元素, id class都支持
      • dom元素后可以 click 点击 , type 填充内容, each 循环dom列表, first 第一个儿子等.
  • cypress/support/commands.ts
    • // Cypress.Commands.add(‘login’, (email, password) => { … })
      • 登录方法可以封装成全局方法
  • cypress/e2e/home-cypress.cy.ts
    describe('template spec', () => {
      beforeEach(() => {
        cy.viewport(2000, 1000);
        cy.session('mySession', () => {
          cy.visit('https://xxxx');
          cy.get('#account').type('xxxx');
          cy.get('#password').type('xxxx');
          cy.get('.btn-login').click();
        });
      });
      it('login done', () => {
        cy.origin('https://xxxx', () => {
          cy.visit('https://xxxx/xxx');
          cy.on('uncaught:exception', (e) => {
            // 控制台报错会让测试停止,需要添加这段
            return false;
          });
          // cy.wait(500)  等待时间 , 直接写wait或者 get第二个参数填写timeout
          cy.get('.ls-workstation-sidebar-avatar-name', { timeout: 30 * 1000 }).should('contain', '刘胜');
          cy.get('.ant-pro-form-collapse-button', { timeout: 30 * 1000 }).each(($el, index, $list) => {
            // $el is a wrapped jQuery element
            cy.wrap($el).click();
          });
          cy.get('#contractNo', { timeout: 30 * 1000 }).type('PH0038417');
          const btnEles = cy
            .get('button.ant-btn-primary', { timeout: 30 * 1000 })
            .first()
            .click();
        });
      });
    });
    

selenium使用

  • npm install selenium-webdriver
  • npm install chromedriver --save
  • npm下载以外还可以手动下载浏览器

使用流程

  • 官方入门指南
  • 写js文件, 用node执行此文件
  • 会自动打开谷歌,然后自动执行代码

code

  • 指令解析
    • driver.get 导航到url
    • driver.findElement(By.css()) dom元素, by.css里可以是id class
      • sendKeys 填充内容, click点击, getText 得到文本内容
    • driver.findElements dom元素列表
  • tests/home-selenium.js
    const {By, Builder, until} = require('selenium-webdriver');
    const assert = require("assert");
    
    const driver = new Builder().forBrowser('chrome').build();
    
    (async function () {
    
            // 导航到某个网站
            await driver.get('https://xxx/xxx');
            driver.findElement(By.css('#account')).sendKeys('ddd');
            driver.findElement(By.css('#password')).sendKeys('aaa');
            await driver.findElement(By.css('.btn-login')).click();
    
            const avatarName = await driver.wait(
              until.elementLocated(By.className('ls-sidebar-avatar-name')),
              30000,
            );// 等待得到这个dom,超时时间30000ms
            const avatarText = await avatarName.getText();
            assert(avatarText === '清羽', 'login done');// 断言
    
            const contractNoEle = await driver.wait(until.elementLocated(By.css('#contractNo')), 30000);
            contractNoEle.sendKeys('PC00398414');
            const collapseEles = await driver.findElements(By.css('.ant-pro-form-collapse-button'));
            for (const ele of collapseEles) {
              ele.click();
            }
    
            const btnEles = await driver.findElements(By.css('button.ant-btn-primary'));
            let index = 0;
            for (const ele of btnEles) {
              if (index == 0) {
                ele.click();
              }
              index++;
            }
        // 关闭浏览器
        // await driver.quit();
    })();
    

playwright

  • 下载
    • tnpm init playwright@latest
  • 官方插件
    • Playwright Test for VSCode 插件

使用流程

  • 官方入门文档
  1. 使用官方插件测试, 选中home.spec.ts点击三角执行,会打开WebDriver(需勾选show browser),然后可以看到自动化测试页面
    - 前端实现端到端测试(代码版)
    • 不勾选,使用无头浏览器测试,勾选后测试会打开WebDriver

      • 前端实现端到端测试(代码版)
    • WebDriver文章来源地址https://www.toymoban.com/news/detail-440229.html

      • 前端实现端到端测试(代码版)
    1. 指令执行测试
    • 测试文件
    • npx playwright test example.spec.ts
    • 在特定浏览器上运行测试
      • npx playwright test home.spec.ts --project=‘chromium’
        • 测试报告前端实现端到端测试(代码版)
      • codegen在浏览器中运行并执行操作。Playwright 将为用户交互生成代码。
        • npx playwright codegen home.spec.ts

code

  • 指令解析
    • test.beforeEach 每次子test执行之前会执行一下
    • page.locator(“#account”) 得到dom元素
      • fill 快速填充, click点击, filter 过滤 , first 第一个儿子
    • async await 异步变同步
  • tests/home.spec.ts
    test.describe("workstation login", () => {
      test.beforeEach(async ({ page }) => {
        await page.goto(
          "https://xxxx/xxx"
        );
      });
    
      test("login", async ({ page }) => {
        await page.locator("#account").fill("xxx");
        await page.locator("#password").fill("xxx");
        await page.locator(".btn-login").click();
        const avatarName = await page.locator(
          ".lzd-workstation-sidebar-avatar-name"
        );
        expect(avatarName).toContainText("万物");
    
        await page.locator('div').filter({ hasText: /^Expand$/ }).first().click();
        await page.locator('div').filter({ hasText: /^Expand$/ }).first().click();
    
        await page.locator("#contractNo").first().fill("PC09038414");
        await page.locator("button.ant-btn-primary").first().click();
    
      });
    });
    
  • playwright.config.ts
    • 配置文件
    import { defineConfig, devices } from '@playwright/test';
    
    /**
     * Read environment variables from file.
     * https://github.com/motdotla/dotenv
     */
    // require('dotenv').config();
    
    /**
     * See https://playwright.dev/docs/test-configuration.
     */
    export default defineConfig({
      testDir: './tests', // 测试目录
      expect: {
        /**
         * expect()应等待满足条件的最长时间
         * 例如,在'await expect(locator).toHaveText()'
         */
        timeout: 20 * 1000,
      },
      timeout: 30 * 1000, // 每个测试用例超时
      globalTimeout: 60 * 1000, // 总超时
      fullyParallel: true,
      /* Fail the build on CI if you accidentally left test.only in the source code. */
      forbidOnly: !!process.env.CI,
      /* Retry on CI only */
      retries: process.env.CI ? 2 : 0,
      /* Opt out of parallel tests on CI. */
      workers: process.env.CI ? 1 : undefined,
      /* Reporter to use. See https://playwright.dev/docs/test-reporters */
      // reporter: 'html',
      reporter: [['html', { outputFolder: './playwrightTests', open: 'always' }]], // 测试报告
      /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
      use: {
        /* Base URL to use in actions like `await page.goto('/')`. */
        // baseURL: 'http://127.0.0.1:3000',
    
        /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
        // trace: 'on-first-retry',
        launchOptions: {
          headless: false, // 不是无头模式
        },
        contextOptions: {
          viewport: {
            // 窗口视野大小
            width: 1400,
            height: 900,
          },
        },
      },
      /* Configure projects for major browsers */
      projects: [
        {
          name: 'chromium',
          use: { ...devices['Desktop Chrome'] },
        },
    
        {
          name: 'firefox',
          use: { ...devices['Desktop Firefox'] },
        },
    
        {
          name: 'webkit',
          use: { ...devices['Desktop Safari'] },
        },
    
        /* Test against mobile viewports. */
        // {
        //   name: 'Mobile Chrome',
        //   use: { ...devices['Pixel 5'] },
        // },
        // {
        //   name: 'Mobile Safari',
        //   use: { ...devices['iPhone 12'] },
        // },
    
        /* Test against branded browsers. */
        // {
        //   name: 'Microsoft Edge',
        //   use: { ...devices['Desktop Edge'], channel: 'msedge' },
        // },
        // {
        //   name: 'Google Chrome',
        //   use: { ..devices['Desktop Chrome'], channel: 'chrome' },
        // },
      ],
    
      /* Run your local dev server before starting the tests */
      // webServer: {
      //   command: 'npm run start',
      //   url: 'http://127.0.0.1:3000',
      //   reuseExistingServer: !process.env.CI,
      // },
    });
    

到了这里,关于前端实现端到端测试(代码版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BsinCopilot:Java版端到端大语言模型开发框架

    BsinCopilot是基于BsinPaaS开源框架构建的大语言模型应用SaaS服务,借鉴langchain的框架思想,引入  langchian4j组件,微前端微服务的架构设计,可快速助您构建和体验端到端的AI应用。 概念 说明 Bsin 毕昇缩写,毕昇,中国北宋发明家,活字印刷术的发明者。毕昇出身平民,长期在

    2024年03月13日
    浏览(41)
  • 实时Flink的端到端检测和测试

    在现代软件开发中,实时数据处理和检测是非常重要的。Apache Flink是一个流处理框架,可以用于实时数据处理和分析。在本文中,我们将讨论Flink的端到端检测和测试,以及如何实现高效和可靠的实时数据处理。 实时数据处理是指在数据生成的同时对数据进行处理和分析。这

    2024年02月22日
    浏览(36)
  • 构建强大的产品级NLP系统:PaddleNLP Pipelines端到端流水线框架解析

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月04日
    浏览(42)
  • NVMe-oF RDMA vs. TCP延时测试对比:端到端SPDK的意义

    前不久看到一篇《 NVIDIA BlueField   再创   DPU   性能世界纪录 》的新闻,该测试环境是2台服务器,每台各安装2块NVIDIA Bluefield-2 DPU,形成4条100GbE以太网直连,两端分别跑NVMe-oF Target(存储目标)和Initiator(主机端)。 测试结果包括TCP和RoCE(RDMA)两部分,上图是第一部分。我

    2024年02月02日
    浏览(50)
  • Humanoid-Gym 开源人形机器人端到端强化学习训练框架!星动纪元联合清华大学、上海期智研究院发布!

      Humanoid-Gym: Reinforcement Learning for Humanoid Robot with Zero-Shot Sim2Real Transfer GitHub Repository: GitHub - roboterax/humanoid-gym: Humanoid-Gym: Reinforcement Learning for Humanoid Robot with Zero-Shot Sim2Real Transfer   Humanoid-Gym是一个基于Nvidia Isaac Gym的易于使用的强化学习(RL)框架,旨在训练仿人机器人的运动

    2024年04月12日
    浏览(31)
  • 从视频源头到边缘智能:实现端到端AI解决方案的技术挑战与实践

    随着人工智能技术的快速发展,端到端AI解决方案在各个领域的应用越来越广泛。这些解决方案能够实现从数据采集到结果输出的完整流程,将人工智能算法与物理设备、网络通信和云服务等技术有机结合,为用户提供全面、高效的智能化体验。 使用边缘计算的好处在于它能

    2024年02月13日
    浏览(29)
  • Kafka系列之:基于Apache Kafka Connect实现端到端topic数据字段级加密的详细方法

    与其他通信工具一样,加密在 Apache Kafka 中很有价值,可以保护数据。 希望通过与 Apache Kafka Connect 集成来加密数据来实现这一目标。 Kafka 可以利用多种安全功能,从身份验证和授权到基于 TLS 的数据进出 Kafka 主题的线上流量加密。尽管这些措施可以保护传输中的数据,但它

    2024年02月13日
    浏览(35)
  • 端到端自动驾驶

    自动驾驶主要流程:感知-预测-规划 预测是预测周围目标(车、行人、动物等)的轨迹,规划是规划自车的运动轨迹。 使用transformer架构, 统一自动驾驶流程 ,完成所有检测,跟踪,建图,轨迹预测,占据栅格预测与规划的端到端推理。 参考: CVPR 2023 Award Candidate | 自动驾

    2024年01月25日
    浏览(28)
  • 重估端到端原则

    评价技术迭代的旧的定势眼光来自于该技术诞生时。 1970/80/90 年代,相比传输带宽技术,处理器更强。网络协议倾向于字段多,字段小且紧凑,尽可能减少传输量,用 “算法技巧” 等价,如果 TCP 序列号 48 位,win 48 位,端口号 48 位,所有与 PAWS,win scale option,get unique tup

    2024年02月07日
    浏览(46)
  • 【端到端图像压缩】CompressAI运行记录

    目录 0 前言 1 代码来源 2 代码的运行 2.1 CompressAI下载与安装 2.2 运行示例程序 3 结果分析 4 结论 5 参考文献 0 前言 期末作业要求运行端到端的图像压缩代码,过程中学习了csdn上诸多教程。这里将运行的过程分享出来。 1 代码来源 目前大多数文献附带的代码是在Linux平台使用

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包