我正在为一个大型Web应用程序编写自动化测试。 我有一个页面对象文件,其中包含与正在测试的组件有关的所有元素的选择器以及测试文件(一个文件包含一个组件的多个测试用例)。
主要问题是:将多个测试使用的函数放在哪里? 以下哪种做法是正确的? (po =页面目标文件)
没有期望/断言命令的功能应位于po中,而其他命令应位于帮助文件中(每个组件/功能1个帮助文件)
帮助文件中的所有功能
在po中没有期望/断言命令的功能,其他命令应只写在测试本身中(此时某些测试文件可能有700多个行)
如果有人能告诉我哪种方法是正确的方法,我将不胜感激
p.s。使用javascript / typescript,硒webdriver,量角器,茉莉进行网络自动化
答案 0 :(得分:1)
一切都对您有好处。没有一个正确的答案。因此,我将分享我在当前项目中适合自己的经验。这是我的测试脚本的简短示例
"use strict";
/*********************************************
* Imports
*********************************************/
const users = require("page-objects/users");
const {logIn, logOut} = require("actions/actions");
const editUser = require("page-objects/dialogs/edit-user");
/*********************************************
* E2E Test
*********************************************/
describe("Suite: Right for export", () => {
beforeAll(async () => await logIn("user-list"));
afterAll(async () => await logOut());
it("Case - Export enabled", async () => {
await users.searchFor("testuser12");
await users.clickEditLink("testuser12");
await editUser.enableExport(true);
await editUser.update();
expect(await users.getCellValue("Is Export Enabled")).toBe("YES");
});
});
1)页面对象中有什么?
如您所见,我宁愿坚持在测试中坚持到底。因此,searchFor单击搜索字段,将其清空,键入传递的字符串,按Enter,然后调用等待功能,直到应用搜索为止。但是,如果没有技术人员想要手动进行操作,他们可能会猜测他们需要执行以上所有操作才能找到所需的内容。这就是为什么对他们来说无关紧要的所有东西都在Page-Objects的幕后。
2)页面对象是否应包含功能?
为什么不呢? :)可以说我有一个更改用户权限的弹出窗口。除了页面对象(与测试分离的文件)中列出的所有定位符之外,我还可以包括针对它执行的操作。假设selectOption()将单击下拉菜单->选择选项->确认。或者,您想单击更新按钮,然后等待对话框消失。这些都是我的采购订单中方法的示例。看一下语法:如果非技术人员看到editUser.enableExport(true);
,他们可能会根据其所在对象的名字(针对执行该操作的页面)来找出答案-在此处editUser弹出窗口中,则该方法为self说明性显示了它的作用-启用导出权限(或如果传递false则禁用导出),然后在()内列出参数-true或false。但是,请避免在您的PO中使用期望语句,因为这是测试的目的。
3)如何构建文件?
可能需要分隔超过700行的所有内容。但这不是规则,而是我的经验。每个组件(有时每页)创建一个文件。但是,例如,如果页面具有弹出窗口,则它可能是单独的页面对象。要组织代码,请使用js类,构造函数(查找它们)。然后,如果您的配置指向这些文件,则可以分配一个全局变量。或者像我一样,在每次测试之前都需要必要的组件-更长的时间,但是将所有内容都放在一个地方。
祝你好运!
答案 1 :(得分:0)
通过业务逻辑,页面区域或功能区域将每个页面分成小组件。
定义选择器,用于操作元素的功能,用于验证单个文件中每个组件的功能。
为页面定义文件以引用组件。
对于多个页面使用的公共组件,您可以移动到公共文件夹。
文件夹结构:
Project Folder
|
-- PageA foler
CompA.ts
CompB.ts
...
index.ts
// Index.ts
class PageA {
public compA;
public compB;
contructor() {
this.compA = new CompA()
this.compB = new CompB()
}
}
export = new PageA();
//茉莉花test-compA.ts
pageA.compA.inputUserName();
pageA.compB.clickLogin();
pageA.compB.verify...();
//茉莉花test-pageA.ts