每个电子商务网站的核心是其“结帐”过程。商店发生的任何事情都应该有效,以确保现金流。这就是为什么应定期测试结帐的原因。为了减少人为因素并确定过程的稳定性,我们建议使用测试自动化框架。最简单的开始是codeceptjs
什么什么?你说codeceptjs吗?
是! CodeceptJS是JavaScript的流行开源测试框架。它旨在使使用可读和直观的语法易于编写和维护Web应用程序的端到端测试。要在浏览器中运行测试,它使用Microsoft的 Playwright 库。
codeceptjs于2015年首次发布,此后已成为JavaScript开发人员的流行测试框架。从初创企业到大型企业,各种规模的组织都广泛使用它。
让我们安装codeceptjs!
要安装CodeCeptJS,您需要在系统上安装Node.js和NPM(NODE.JS软件包管理器)。您可以通过在终端中运行以下命令来检查是否已经安装了这些工具:
node --version
npm --version
如果这些命令中的任何一个都返回错误,则需要安装node.js和npm,然后才能安装codeceptjs。您可以从官方网站下载并安装最新版本的node.js,其中包括NPM。
安装CodeCeptjs创建一个新文件夹并运行命令表格终端:
npx create-codeceptjs .
如果运行NPX CREATE-CODECEPTJS。命令,它将在当前目录中使用playwright安装codeceptjs。
npx
命令是NPM(node.js package manager)随附的工具,它允许您运行NPM软件包,而无需在系统上全球安装它们。
下载浏览器时可能需要一些时间:Chrome,Firefox和Safari并创建一个演示项目。
,但我们在这里编写结帐测试,对
让我们初始化一个新项目!
运行
npx codeceptjs init
同意默认值(按每个问的问题按Enter)。当询问基本网站URL时,请提供您正在测试的电子商务网站的URL。例如,如果您在本地运行该网站,则可能是:https://myshop.com
如果您测试已经发布的网站或http://localhost
。
当询问测试名称和套件名称时,请写“结帐”。它将创建以下杂性结构:
.
├── codecept.conf.js
├── package.json
└── Checkout_test.js
项目目录根部的codecept.conf.js
文件包含codeceptjs的全局配置设置。
现在打开测试:
Feature('Checkout');
Scenario('test something', ({ I }) => {
});
在方案块中您编写测试。
将I.amOnPage('/')
添加到其中。它将打开您指定为基础的URL上的浏览器。
Feature('Checkout');
Scenario('test something', ({ I }) => {
I.amOnPage('/')
});
但是您可能想问...
我是什么?
很高兴您问!
在codeceptjs中,I
对象用于表示用户在测试方案中执行操作。它提供了许多方法(也称为操作),可用于模拟用户与正在测试的应用程序的交互。
i对象中一些最受欢迎的动作是:
-
I.amOnPage(url)
:此操作将用户导航到指定的URL。 -
I.click(locator)
:此操作模拟给定定位器确定的元素单击。 -
I.fillField(field, value)
:此操作填充了指定的字段。 -
I.see(text, context)
:此操作检查给定文本是否在页面上可见(或指定上下文中)。 -
I.selectOption(select, option)
:此操作从给定的选择下拉列表中选择指定的选项。 -
I.waitForElement(locator, timeout)
:此操作等待指定的元素出现在页面上,直到给定超时。 -
I.waitForText(text, timeout, context)
:此操作等待给定文本出现在页面上(或指定上下文中),直到给定超时。
我们将需要使用它们来导航到结帐过程。我们如何导航网络?确保单击链接!
让我们使用I.click()
。
但是我们如何访问网页上的元素?
codeceptjs足够聪明,可以通过其可见文本找到可单击的元素。例如,如果在您的电子商务网站上,您可以使用该名称的“咖啡杯”,您可以使用
I.click('Coffee Cup');
,但有时元素不太容易找到,因此您可以使用CSS或XPATH定位器来定位它们。
例如,通过CSS找到咖啡杯可以进入页面和元素属性的Accont HTML结构。例如,可以这样:
I.click('div.products a.product-name[title="Coffee Cup"]');
在此示例中,选择器的div.products
部分指定了带有products
类的DIV元素,而a.product-name[title="Coffee Cup"]
零件则指定了一个a元素,其中the product-name
class和title
属性设置为咖啡杯。
您可以阅读有关HTML和CSS定位器的更多信息,基本上,这就是您开始编写结帐测试所需的一切!
回到结帐
让我们看看常规结帐脚本在codeceptjs中的外观:
Scenario('test the checkout form', async ({ I }) => {
// we select one product and switched to checkout project
I.amOnPage('/');
I.click('Coffee Cup');
I.click('Purchase');
I.click('Checkout');
// fill in the shipping address
I.fillField('First Name', 'John');
I.fillField('Last Name', 'Doe');
I.fillField('Address', '123 Main St.');
I.fillField('City', 'New York');
I.selectOption('State', 'New York');
I.fillField('Zip Code', '10001');
// select a payment method
I.click('#credit-card-option');
I.fillField('Card Number', '1234-5678-9012-3456');
I.fillField('Expiration Date', '12/22');
I.fillField('Security Code', '123');
// click the checkout button
I.click('Checkout');
// verify that the checkout was successful
I.see('Your order has been placed successfully!');
});
肯定的是,您的脚本可能更复杂。如您所知,我们使用CSS定位器'#credit-card-option'
获取选择付款选项。但是,该测试很简单,您可以按照用户步骤进行操作。
请注意,您不应该在此处使用真实的信用卡号码。好消息,您不需要。付款提供商(例如Strip)提供虚拟卡号,用于测试目的。
使用下一个命令进行测试:
npx codeceptjs run --debug -p pauseOnFail
这里有什么特殊选择?
-
--debug
标志用于将其他信息输出到控制台,例如测试中每个步骤的详细信息,变量值以及测试断言的结果。这可以帮助您识别和解决测试中的任何问题。 -
-p pauseOnFail
选项也用于保持浏览器打开,即使测试失败也是如此。它将帮助我们确定执行哪个点测试以及可以改进的要点。
如果需要,请添加更多测试步骤,更新定位器,并通知企业主,所有购买都是您进行的,这样您的大学就不会在晚上打电话给您,询问您何时想获得咖啡杯好主意是在登台网站上运行测试,不干扰业务流程。
什么测试完成了,您可以使用:
运行它
npx codeceptjs run
如果您很生气看到浏览器窗口,则可以使用HEADLESS
环境变量:
HEADLESS=true codeceptjs run
对于Windows用户,应以不同的方式设置无头:
set HEADLESS=true&& codeceptjs run
测试将通过,但没有显示浏览器,因此您可以在进行时观看YouTube视频!
重构
如果您需要检查更多购买怎么办?您应该为此复制粘贴代码吗?
不!您可以使用页面对象模式将重复交互放入可重复使用的功能中。
您可以通过Next命令创建页面对象:
npx codeceptjs gpo
当然,我们将其称为Checkout
。它将在./pages/Checkout.js
文件中创建。您应该在include
中的codecept.conf.js
中启用它:
include: {
...
checkoutPage: './pages/Checkout.js',
},
现在打开此文件:
const { I } = inject();
module.exports = {
// insert your locators and methods here
}
感觉真的很空。我们应该怎么做?我们应该编写更多代码吗?不,我们已经有了它。让我们从测试中复制代码块,并将它们放在corledponnding函数名称下:
connst { I } = inject();
module.exports = {
fillShippingAddress(name, address, city, state, zip) {
I.fillField('Name', name);
I.fillField('Address', address);
I.fillField('City', city);
I.fillField('State', state);
I.fillField('Zip', zip);
},
fillValidCreditCard() {
I.click('#credit-card-option');
I.fillField('Card Number', '1234-5678-9012-3456');
I.fillField('Expiration Date', '12/22');
I.fillField('Security Code', '123');
},
checkout() {
I.click('Checkout');
},
}
之后,我们可以更新测试以使用创建的页面对象。请注意,我们通过其名称checkoutPage
导入Checkout PageObject,我们以前在配置中定义了。
Scenario('test the checkout form', async ({I, checkoutPage}) => {
I.amOnPage('/');
I.click('Coffee Cup');
I.click('Purchase');
I.click('Checkout');
// fill in the shipping address using the page object
checkoutPage.fillShippingAddress('John', 'Doe', '123 Main St.', 'New York', 'New York', '10001');
checkoutPage.fillValidCreditCard();
checkoutPage.checkout();
// verify that the checkout was successful
I.see('Your order has been placed successfully!');
});
您看到测试的代码减少了。我们可以以相同的方式编写类似的测试。
通过申请越来越多的案例,您可以对所有行为进行测试。
概括
这是一个深入的潜水!如果您考虑仅启动测试自动化,则CodeCeptJS是您的最佳选择,因为它使用本地语言将命令传递给浏览器。
如果您已经熟练使用JavaScript,则可以使用CodeCeptJS,可以专注于测试的业务级别,而不是为浏览器编写代码。这样,您可以保持测试稳定且可维护。
提供测试网站的日常状态,请使用Testomat.io进行测试报告。因此,您始终知道最后一次检查何时执行以及通过了哪些测试和失败。
享受测试!