端到端测试Playwright入门版教程

发表于:2022-3-21 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:麻辣香锅1994    来源:掘金

  背景
  随着产品的快速迭代,会出现产品被前方催着要功能,发包来不及测试的场景(回归测试),为解决这种问题,故推行了端到端测试的试行。

  Playwright介绍
  Playwright 是微软公司开源的一款端到端测试工具,专门为满足端到端测试的需要而创建的。作为一个测试工具,集成了断言、录屏、跟踪记录、截屏、自动生成测试用例报告等等功能,提供了多种编程语言的API,包括 TypeScript、JavaScript、Python、.NET和Java等。

  支持以chromium、firefox和webkit为内核的浏览器进行自动化测试
  Playwright推荐适配的第三方测试框架:
  Playwright Test
  Jest / Jasmine
  AVA
  Mocha
  Multiple Browsers
  因为Playwright Test是微软推出的匹配playwright测试工具的测试框架,匹配度和功能度上都更完整更好用,所以我们选择了Playwright Test测试框架。

  Demo测试场景描述
  在百度搜索Playwright,根据返回的搜索内容判断第一条内容是否符合我们的搜索结果。

  前提条件
  运行环境:node环境 (优先安装好node)
  测试框架:Playwright-test
  语法:TypeScript
  测试工具:Playwright
  测试工具依赖的特定测试浏览器(任意一个):谷歌、Safari、Opera、Edge、火狐等任选其一。
  注意:Playwright不支持babel编译,所以要结合ts,具体看个人需求,如不使用ECMAScript相关语法无需配置。

  安装依赖包
yarn add playwright  @playwright/test typescript ts-node
#OR 
npm install playwright  @playwright/test typescript ts-node

  配置项目配置文件
    ... 
    "scripts": { "test": "playwright test" }
}

  公共配置playwright.config.ts
  详细配置参考:https://playwright.dev/docs/test-configuration
import { PlaywrightTestConfig } from "@playwright/test"; 
let config: PlaywrightTestConfig = {
     timeout: 6 * 60 * 1000,  // 每个测试用例超时 
     globalTimeout: 60 * 1000, // 总超时     
     testDir: "./demo",//测试目录     
     reporter: [["html", { outputFolder: "./", open: "always" }]],//测试报告
     use: {
        launchOptions: {
        headless: false, //不是无头模式
        // recordVideo:'videos'
        // recordVideo
        // devtools: true,
    },
    contextOptions: {
    viewport: {   //窗口视野大小
        width: 1400,   
        height: 900,
    },
  },
    //baseURL: process.env.TENANT_URL, // 基础URL           
    screenshot: "only-on-failure", // 失败时截屏   
    trace: "retain-on-failure",// 失败时跟踪记录       
    browserName: "webkit", // 测试浏览器 
    }, 
};
export default config;

  配置tsconfig.json
    "compilerOptions": { 
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    /* Basic Options */ 
    "target": "es2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ "module": "commonjs", 
    /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 
    "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 
    /* Advanced Options */ 
    "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }    
}

  编写测试用例
  1、根目录下创建测试目录demo。
  2、创建测试用例文件。
import { expect, test } from "@playwright/test"; import { chromium } from "playwright"; 
import { TestOperationPanel } from "./TestOperationPanel"; 
import { judgeSystem } from "./config"; 
let  testOperation: TestOperationPanel, browser, page, context; 
    /**测试用例组**/ 
    test.describe("Playright-demo", async function () { 
    /**运行所有测试用例前的函数**/ 
        test.beforeAll(async ({ browserName }, testConfig) => { 
        /**判断系统类型配置**/ 
        const launch = await judgeSystem(); 
        /**创建浏览器**/ 
        browser = await chromium.launch(launch); 
        /**创建窗口**/ 
        context = await browser.newContext(); 
        /**创建界面**/ 
        page = await context.newPage(); 
        /**创建UI交互配置代码实例**/ 
        testOperation = new TestOperationPanel(page); }); 
        /**运行每个测试用例前的函数**/ 
        test.beforeEach(async function () { 
        /**跳转地址**/ 
        await testOperation.goTestUrl("http://www.baidu.com"); }); 
        /**测试用例**/ 
        test("搜索Playwright", async function () { 
        /**搜索指定内容**/ 
        const result = await testOperation.searchContent("playwright"); 
        /**断言校验匹配的内容**/   
        expect(result).toMatch(/^playwright/); }); 
        /**运行所有测试用例后的函数**/ 
        test.afterAll(async function ({ browser }) { 
            /**关闭浏览器**/
            await browser.close()
        });
});

  3、创建测试用例公共设置文件。
  在demo文件夹下创建config.ts文件,因为需要匹配不同操作系统,所以单独配置浏览器。
import os from "os"; 
import fs from "fs";
/** * 判断操作系统决定lanuch条件 * @returns */ 
export function judgeSystem() { 
        const osType = os.type(); 
        if (osType === "Darwin") { 
        /**macOS系统下测试浏览器的配置 */ 
        return { executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", //浏览器地址 }; } 
        if (osType === "Linux") { 
        /**Linux系统下测试浏览器的配置 */ 
        // return {  devtools: true  } 
        }
        if (osType === "Windows_NT") {
        /**windows系统下测试浏览器的配置 */ 
        // return {  devtools: true  } 
        } 
}

  4、在demo文件夹下TestOperationPanel.ts。
  实现UI交互层代码和业务代码分割,捕获元素的方法较多。
//UI交互层代码 
import { Page } from "playwright"; 
export class TestOperationPanel { 
    protected page: Page; 
    constructor(page: Page) { 
        this.page = page;
    } 
    /** * 加载测试的网址 */ 
    goTestUrl = async (url: string) => { 
        /**跳转地址**/ 
        await this.page.goto(url);
        /**等待页面加载**/ 
        await this.page.waitForLoadState(); }; 
        /** * 搜索指定内容 */ 
        searchContent = async param => { 
        /**在输入框中填充搜索字段**/ 
        await this.page.locator(".s_ipt").fill(param); 
        /**在输入框中回车触发搜索**/ 
        await this.page.locator(".s_ipt").press("Enter");
        /**等待页面加载**/ 
        await this.page.waitForLoadState(); 
        /**返回搜索内容第一项的内容**/ 
        const result = await this.page.locator('//div[@id="1"]/h3//em').textContent(); 
        return result; 
    }
}

  运行测试用例
npm run test  //若需要获取运行的详细日志可在运行前加DEBUG=pw:api

  好啦,到此我们的端到端入门介绍就竣工啦,有疑惑或者指正的欢迎来聊~

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号