Web 自动化神器 TestCafe(三)—用例编写篇

190 篇文章 0 订阅
188 篇文章 3 订阅

一、用例编写基本规范

1、 fixture 测试夹具

使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具

  • fixture(测试夹具)的声明 import 'testcafe' // 声明一个测试夹具 百度测试 fixture `登录功能测试` 上面是官方文档中的 demo,调用 fixture 方法声明测试夹具的时候,使用的是模板字符串传参的形式,对于没用过这种语法的小伙伴来说看起来不太好理解,可以按下面这个使用括号调用函数的形式来写。 import 'testcafe' // 声明一个测试夹具 新浪测试 fixture('注册功能测试')
  • fixture.page 方法: 通过 fixture.page 方法,我们可以在测试夹具打开一个要进行测试的页面 fixture('百度登录测试').page('https://www.baidu.com');

2、test 测试函数

2.1、测试用例编写

  声明了测试夹具之后,就可以定义测试用例了,在testcafe中写测试用例,直接调用测试函数test, 并传递一个内部带有测试代码的函数即可 。
  import 'testcafe'
// 在测试夹具中打开百度页面
fixture('百度案例').page('https://www.baidu.com');

// 第一条用例:百度输入 学习点击搜索
test('用例1', async t => {
    await t.typeText('#kw', "学习")
        .click('#su');
});

// 第二条用例:百度输入 python 点击搜索
test('用例2', async t => {
    await t.typeText('#kw', "python")
        .click('#su');
});
  • 关于上面测试函数 test 调用的说明 test 方法的第一个参数为测试用例的名称,第二个参数是写测试代码的函数 关于参数 t: 在 testcafe 中 所有测试动作都需要使用 测试控制器对象的异步功能来实现。箭头函数定义的参数 t 就是用来接收测试控制器对象的。 上面写测试代码的函数是使用 async/await 语法定义的函数,这也是 testcafe 的推荐写法,在执行相关测试动作时,如果要等待前一个动作执行完成,再调用下一个动作或动作链,只需要进行等待的动作前面加上关键字 await 即可。

2.2、指定测试开始页面

在 fixture 中可以通过 page 方法去打开一个测试的初始页面,当然在 test 方法中如果不用 fixture 打开的初始页面,也可以使用 tes.page 自定义一个测试初始打开页面,如下:

  fixture(`百度案例`).page `https://www.taobao.com`;

test.page('https://www.baidu.com')('百度搜索功能', async t => {
    await t.typeText('#kw', "hao123")
        .click('#su');
});

二、测试前后置处理

在工作中执行测试时,大多数的用例执行,都会有一些用例前置准备或者后置清理工作要去做。关于前后置处理的方法,我们称之为钩子函数,testcafe 提供了两种钩子,一种叫测试钩子,一定叫固定钩子。

1、测试钩子

测试钩子指的是每一条测试用例执行之前和执行之后,会执行的钩子函数,我们称之为测试钩子,关于测试钩子 Testcafe 提供了如下四个方法。

  • fixture.beforeEach 方法

测试夹具 fixture 提供了一个 beforeEach 方法,可以给该 fixture 中的每一条测试用例设置前置执行的操作。案例代码如下:

  import 'testcafe'

fixture(`百度案例`)
    .page('https://www.baidu.com')
	// 设置每条用例执行的前置操作
    .beforeEach(async t => {
        await t.typeText('#kw', "前置步骤").click('#su')
    });

  • fixture.afterEach 方法
  fixture(`百度案例`)
    .page('https://www.baidu.com')
	// 设置每条用例执行的前置操作
    .beforeEach(async t => {
        await t.typeText('#kw', "前置步骤")
    })
    .afterEach(async t => {
        await t.typeText('#kw', "后置步骤").click('#su')
    });

上面这两种方法可以给通过测试夹具 fixture 给该夹具下的每条用例设置前后置操作。如果某一条用例需要单独的设置前后置,则需要使用 test.before 方法和 test.after 方法。

  • test.before 方法

给单独的用例设置前置操作

  test.before(async t => {
    await t.typeText('#kw', "test设置的前置")
    })
    ('百度搜索功能', async t => {
        await t.typeText('#kw', "python")
            .click('#su');
    })

  • test.after 方法

给单独的用例设置后置操作

  test.before(async t => {
    await t.typeText('#kw', "test设置的前置")
    })
    ('百度搜索功能', async t => {
        await t.typeText('#kw', "python")
            .click('#su');
    })
    .after(async t => {
        await t.typeText('#kw', "后置方法中输入的内容")
            .click('#su');
    })   
  • 测试钩子和测试代码之间共享数据 如果需要在测试钩子和测试代码直接共享数据的话,我们可以通过测试上下文(t.ctx 属性)来进行传递。在测试钩子中将数据保存到测试上下文中,在测试方法中再去测试上下文中获取数据。具体案例如下: test.before(async t => { // 在测试钩子中通过t.ctx保存数据 t.ctx.token = 'musen123' }) ('百度搜索功能', async t => { // 测试钩子中通过t.ctx获取数据 console.log(t.ctx.token) })

2、夹具钩子

  夹具钩子和测试钩子不同,夹具钩子只会在夹具中的第一个测试开始之前和最后一个测试完成之后运行。要添加夹具钩子,可以使用fixture.before和fixture.after方法来定义定义。另外在夹具钩子中无法访问测试页面,也无法对测试页面进行相关操作。
  • fixture.before 方法
  fixture(`百度案例`)
.page('https://www.baidu.com')
.before( async ctx => {
    // 前置夹具钩子
    console.log(ctx)
})
  • fixture.after 方法
  fixture(`百度案例`)
.page('https://www.baidu.com')
.after( async ctx => {
    console.log(ctx)
     // 后置夹具钩子
});
  • 夹具钩子和测试代码之间共享数据 传递给 fixture.before 和 fixture.after 方法的钩子函数接收一个夹具上下文的参数 ctx。需要进行数据传递时,我们可以在夹具钩子中把数据保存到 ctx 的属性中。在测试代码中使用 t.fixtureCtx 来获取。案例代码如下:
  fixture(`百度案例`)
    .before(async ctx  => {
    	// 夹具钩子中保存数据
        ctx.someProp = 123;
    })

test('Test1', async t => {
    // 测试代码中获取数据
    console.log(t.fixtureCtx.someProp); 
});

三、跳过和选择用例

1、跳过用例

  在执行测试的时候,如果说有用例不想执行,那么我们可以设置跳过用例执行。关于跳过用例执行testcafe中提供了fixture.skip 和test.skip方法。
  • fixture.skip:跳过整个 fixture 的用例
  • test.skip:跳过当前的测试用例 // 跳过夹具F1中所有的用例 fixture.skip('F1'); test('F1-->用例1', async t => { }); test('F1-->用例2', async t => { }); fixture('F2'); // 跳过这一条用例 test.skip('F2-->用例1', async t => { }); test('F2-->用例1', async t => { });

2、选择用例

另外我们也可以使用 fixture.only 和 test.only 来筛选执行需要的用例,只有选择的用例或夹具运行,而所有其他应被跳过

  • fixture.only:选择执行的测试夹具
  • test.only:选择执行的测试用例 // 选择F1这个测试夹具 fixture.only('F1'); test('F1-->用例1', async t => { }); test('F1-->用例2', async t => { }); fixture('F2'); // 选择这一条用例 test.only('F2-->用例1', async t => { }); test('F2-->用例1', async t => { });

以上就是 testcafe 中用例编写的所有内容啦,后续会持续更新 TestCafe 的相关使用文档。

### 回答1: 答:我可以为您提供一个使用Python语言和Page Object设计模式实现的接口测试用例的示例,请参考以下代码:from pageobjects.checkout_page import CheckoutPagedef test_checkout(): checkout_page = CheckoutPage() checkout_page.open() checkout_page.fill_billing_information() checkout_page.fill_shipping_information() checkout_page.fill_payment_information() checkout_page.submit_order() assert checkout_page.order_confirmation_displayed() ### 回答2: 使用Python编写接口测试用例可以使用unittest框架,而Page Object设计模式可以提高测试用例的可维护性和可扩展性。 首先,需要导入所需的库,包括unittest和requests。然后,可以定义一个基类,该基类用于封装HTTP请求和响应,并提供一些常用的接口测试方法。 接下来,可以创建一个页面对象类,该类代表要测试的接口。页面对象类的作用是将具体的接口请求方法和数据封装起来,以便在测试用例中使用。 在页面对象类中,可以定义各种接口的请求方法,并使用requests库发送HTTP请求。接口的请求方法可以包括GET、POST等方法,可以传入请求的URL、header、参数、body等参数,并返回相应的响应。 然后,可以创建一个测试用例类,该类继承自unittest.TestCase类,并使用setUp方法初始化页面对象,并在测试方法中调用页面对象的接口方法进行接口测试。可以使用断言方法来验证接口的返回结果是否符合预期。 最后,在测试用例中可以使用unittest框架提供的一些装饰器(如@classmethod、@staticmethod)来控制测试用例的执行顺序和测试用例的预处理和后处理。 通过以上步骤,可以实现一个简单的接口测试用例demo,并使用Page Object设计模式来提高测试用例的可维护性和可扩展性。将各个接口的请求方法和数据封装到页面对象类中,可以使测试用例更加清晰、可读性更高,也方便后续的维护和扩展。同时,使用unittest框架可以提供丰富的测试用例管理和执行功能,可以方便地运行和管理接口测试用例。 ### 回答3: 使用Python语言编写接口测试用例可以灵活地使用Python的各种库和框架来实现自动化测试。而使用Page Object设计模式可以将页面元素与测试代码分离,提高代码的可读性和可维护性。 首先,需要安装Python的相关库,比如requests库用于发送HTTP请求,unittest库用于编写测试用例等。 接下来,可以创建一个基类BasePage,该类定义了一些通用的方法,比如发送HTTP请求、解析响应等。接口在测试中需要与此类进行交互。 然后,为每个接口创建一个Page类,该类继承自BasePage,并定义了该接口的测试方法。在Page类中,可以定义发送请求的方法、解析响应的方法和对结果进行断言的方法。 最后,创建一个测试类,在该类中实例化所有Page对象,并调用各个Page对象的测试方法。通过断言来验证接口的返回结果是否符合预期。 下面是一个简单的接口测试用例demo的示例代码: ```python import requests import unittest class BasePage: def send_request(self, method, url, data=None, headers=None): if method.upper() == 'GET': response = requests.get(url, params=data, headers=headers) elif method.upper() == 'POST': response = requests.post(url, json=data, headers=headers) else: raise Exception('Invalid request method') return response def parse_response(self, response): return response.json() class GetUserPage(BasePage): def get_user_info(self, user_id): url = f'https://api.example.com/users/{user_id}' response = self.send_request('GET', url) return self.parse_response(response) class TestInterface(unittest.TestCase): def setUp(self): self.get_user_page = GetUserPage() def test_get_user_info(self): user_info = self.get_user_page.get_user_info('123') self.assertEqual(user_info.get('id'), '123') if __name__ == '__main__': unittest.main() ``` 在以上示例中,BasePage类封装了发送HTTP请求和解析响应的方法,GetUserPage类继承自BasePage类,实现了获取用户信息的接口测试方法。TestInterface类继承自unittest.TestCase类,用于执行测试用例。在test_get_user_info方法中,实例化了GetUserPage对象,并调用其get_user_info方法来测试获取用户信息的接口。最后通过断言来验证接口返回的结果是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢软测的小北葵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值