Testing 我该怎么开玩笑呢;木偶演员在多个文件中测试?

Testing 我该怎么开玩笑呢;木偶演员在多个文件中测试?,testing,automated-tests,jestjs,puppeteer,Testing,Automated Tests,Jestjs,Puppeteer,我正在使用Jest&puppeter为用Vue.js编写的前端应用程序编写自动化测试 到目前为止,我成功地编写了一组测试,但它们都位于同一个文件中: import puppeteer from 'puppeteer'; import faker from 'faker'; let page; let browser; const width = 860; const height = 1080; const homepage = 'http://localhost:8001/brt/'; c

我正在使用Jest&puppeter为用Vue.js编写的前端应用程序编写自动化测试

到目前为止,我成功地编写了一组测试,但它们都位于同一个文件中:

import puppeteer from 'puppeteer';
import faker from 'faker';

let page;
let browser;

const width = 860;
const height = 1080;
const homepage = 'http://localhost:8001/brt/';
const timeout = 1000 * 16;

beforeAll(async () => {
  browser = await puppeteer.launch({
    headless: false, // set to false if you want to see tests running live
    slowMo: 30, // ms amount Puppeteer operations are slowed down by
    args: [`--window-size=${width},${height}`],
  });
  page = await browser.newPage();
  await page.setViewport({ width, height });
});

afterAll(() => {
  browser.close();
});

describe('Homepage buttons', () => {
  test('Gallery Button', async () => {

    // navigate to the login view
    await page.goto(homepage);
    await page.waitFor(1000 * 0.5); // without this, the test gets stuck :(

    await page.waitForSelector('[data-testid="navBarLoginBtn"]');
    await page.click('[data-testid="navBarLoginBtn"]'),

    await page.waitForSelector('[data-testid="navBarGalleryBtn"]');
    await page.click('[data-testid="navBarGalleryBtn"]'),

    // test: check if we got to the gallery view (by checking nr of tutorials)
    await page.waitForSelector('.card-header');
    const srcResultNumber = await page.$$eval('.card-header', (headers) => headers.length);
    expect(srcResultNumber).toBeGreaterThan(1);
  }, timeout);
});

describe('Register', () => {
  const btnLoginToRegister = '#btn-login-to-register';
  const btnRegister = '#btn-register';
  const btnToLogin = '#btn-goto-login';

  test('Register failed attempt: empty fields', async () => {
    // navigate to the register form page via the login button
    await page.goto(homepage);
    await page.waitForSelector(navLoginBtn);
    await page.click(navLoginBtn);
    await page.waitForSelector(btnLoginToRegister);
    await page.click(btnLoginToRegister);

    // test; checking for error messages
    await page.waitForSelector(btnRegister);
    await page.click(btnRegister);
    const errNumber = await page.$$eval('#errMessage', (err) => err.length);
    expect(errNumber).toEqual(3);
  }, timeout);

  test('Register failed: invalid char count, email format', async () => {
    // fill inputs
    await page.waitForSelector('#userInput');
    await page.type('#userInput', 'a');
    await page.waitForSelector('#emailInput');
    await page.type('#emailInput', 'a');
    await page.waitForSelector('#emailInput');
    await page.type('#passInput', 'a');
    await page.waitForSelector(btnRegister);
    await page.click(btnRegister);

    // test: check if we 3 errors (one for each row), from the front end validations
    const err = await page.$$eval('#errMessage', (errors) => errors.length);
    expect(err).toEqual(3);
  }, timeout);

  test('Register: success', async () => {
    await page.click('#userInput', { clickCount: 3 });
    await page.type('#userInput', name1);
    await page.click('#emailInput', { clickCount: 3 });
    await page.type('#emailInput', email1);
    await page.click('#passInput', { clickCount: 3 });
    await page.type('#passInput', password1);
    await page.waitForSelector(btnRegister);
    await page.click(btnRegister);

    // test: check if go to login link appeared
    await page.waitForSelector(btnToLogin);
    await page.click(btnToLogin);

    // await Promise.all([
    //   page.click(btnToLogin),
    //   page.waitForNavigation(),
    // ]);
  }, timeout);

  test('Register failed: email already taken', async () => {
    // navigate back to the register form
    await page.waitForSelector(btnLoginToRegister);
    await page.click(btnLoginToRegister);

    await page.click('#userInput');
    await page.type('#userInput', name2);
    await page.click('#emailInput');
    await page.type('#emailInput', email1); // <- existing email
    await page.click('#passInput');
    await page.type('#passInput', password2);

    await page.click(btnRegister);

    const err = await page.$eval('#errMessage', (e) => e.innerHTML);
    expect(err).toEqual('Email already taken');
  }, timeout);
});
从“木偶师”导入木偶师;
从“冒牌货”进口冒牌货;
让页面;
让浏览器;
常数宽度=860;
常数高度=1080;
康斯特主页http://localhost:8001/brt/';
常数超时=1000*16;
之前(异步()=>{
browser=wait puppeter.launch({
headless:false,//如果希望看到测试实时运行,则设置为false
slowMo:30,//ms木偶师操作速度减慢
参数:[`--窗口大小=${width},${height}`],
});
page=wait browser.newPage();
等待page.setViewport({width,height});
});
毕竟(()=>{
browser.close();
});
描述('主页按钮',()=>{
测试('Gallery Button',async()=>{
//导航到登录视图
等待页面。转到(主页);
wait page.waitFor(1000*0.5);//如果不这样做,测试就会卡住:(
等待page.waitForSelector('[data testid=“navBarLoginBtn”]');
等待页面。单击('[data testid=“navBarLoginBtn”]'),
等待page.waitForSelector('[data testid=“navBarGalleryBtn”]');
等待页面。单击('[data testid=“navBarGalleryBtn”]'),
//测试:检查我们是否进入gallery视图(通过检查教程的数量)
wait page.waitForSelector(“.card header”);
const srcrestNumber=等待页面。$$eval('.card header',(headers)=>headers.length);
expect(srcsresultnumber).大于(1);
},超时);
});
描述('寄存器',()=>{
常量btnLoginToRegister='#btn登录到注册表';
常量btn寄存器='#btn寄存器';
常量btnToLogin='#btn转到登录';
测试('注册失败尝试:空字段',异步()=>{
//通过登录按钮导航到注册表单页面
等待页面。转到(主页);
等待页面waitForSelector(navLoginBtn);
等待页面。单击(navLoginBtn);
等待页面。等待选择者(btnLoginToRegister注册表);
等待页面。单击(btnLoginToRegister注册表);
//测试;检查错误消息
等待页面。等待选民(BTN登记);
等待页面。单击(b重新注册);
const errNumber=wait page.$$eval(“#errMessage”,(err)=>err.length);
期望值(errNumber),toEqual(3);
},超时);
测试('注册失败:无效字符计数,电子邮件格式',异步()=>{
//填充输入
wait page.waitForSelector(“#userInput”);
等待页面。键入('#userInput',a');
wait page.waitForSelector(“#emailInput”);
等待页面。键入(“#emailInput”,“a”);
wait page.waitForSelector(“#emailInput”);
等待页面。键入('#passInput',a');
等待页面。等待选民(BTN登记);
等待页面。单击(b重新注册);
//测试:检查前端验证是否有3个错误(每行一个)
const err=wait page.$$eval(“#errMessage”,(errors)=>errors.length);
期望(错误)。托夸尔(3);
},超时);
测试('Register:success',async()=>{
等待页面。单击('#用户输入',{clickCount:3});
wait page.type(“#userInput”,name1);
等待页面。单击(#emailInput',{clickCount:3});
等待页面。键入(“#emailInput”,email1);
等待页面。单击('#passInput',{clickCount:3});
等待页面。键入(“#passInput”,password1);
等待页面。等待选民(BTN登记);
等待页面。单击(b重新注册);
//测试:检查是否出现“转到登录”链接
等待页面。waitForSelector(btnToLogin);
等待页面。单击(BTN登录);
//等待承诺([
//页面。单击(BTN登录),
//page.waitForNavigation(),
// ]);
},超时);
测试('注册失败:电子邮件已发送',异步()=>{
//导航回注册表窗体
等待页面。等待选择者(btnLoginToRegister注册表);
等待页面。单击(btnLoginToRegister注册表);
等待页面。单击(“#用户输入”);
wait page.type(“#userInput”,name2);
等待页面。单击(“#emailInput”);
wait page.type(“#emailInput”,email1);/e.innerHTML);
expect(err).toEqual(电子邮件已被接收);
},超时);
});
我希望能够有一个单独的测试文件来完成之前和之后的工作,并且每个测试套件:HomepageButtons、Register等都驻留在它自己的测试文件中。我怎样才能做到这一点

我试过将TET分为:
testsUtils.js将包含beforeAll和aftereall钩子和代码,但它不能保证它在需要时运行:beforeAll代码将在所有其他测试文件之前启动,aftereall代码将在所有测试文件完成后启动。

对不起,我宁愿对你的问题发表评论,但我对此没有声誉。不管怎么说,我认为你在寻找一个类似“全球前因后果”和“全球后因后果”的挂钩,对吧?这是开玩笑的。它被称为“全球设置”和“全球搜索”

看一看。摘录:

此选项允许使用自定义全局设置模块 导出在所有测试之前触发一次的异步函数 套房

全球拆下一个也一样。 我想你在globalSetup/globalTeardown中获取
页面
浏览器
的引用时会头疼,我承认我从未尝试过。也许这个问题的答案(如果你有)在“没有小丑木偶的自定义示例预设”部分下

还有一个回购协议,它试图促进Jest+木偶演员的整合。也许你会发现它是util:


祝你好运。

阅读页面对象模型:网上有多个教程,其中一个在我的阅读回合中有木偶师+POM,然后再学习一些高级主题,如好运:)