承接上一篇,上一篇提到了,四个 (应该是5个)js ,这里分别用一句话说一下,他们在项目中,分别干啥用的。
grunt :任务运行器。自动化测试运行 的构建工具。
程序中用法:下文介绍gruntfile.js 中。
promise :实现javascript 的异步编程。
程序中用法: .then
char :何总给的解释是:BDD/TDD assertion library :关于TDD/BDD/DDD的一些看法。
程序中用法:就是 assertion.
selenium :
参考资料:基于 Selenium WebDriver 的 Web 应用自动化测试
主要用法,就是selenium-webdriver ,用webdriver ,来操作浏览器,进行自动化测试。
cucumber:Cucumber.js是著名的行为驱动开发(BDD)工具Cucumber的JavaScript版本。
************************分割线*********************************
项目中的文件。
pom.xml
如果用maven 启动测试用例,需要配置pom.xml 。
以 mvn test 命令运行,maven 会访问pom.xml
在pom.xml中,需要用的,就是这个标签。
<executions> API: https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag
原文解释如下:
You can also configure a mojo using the<executions>tag.
This is most commonly used for mojos that are intended to participate in some phases of thebuild
lifecycle. UsingMyQueryMojoas an example,
you may have something that will look like:
就是,maven ,会执行 ,你这个标签下面的,每一个<execution>,每个 <execution>,就是一条命令。 所以,在pom.xml中,下面的代码,就 等同于
grunt firefox chrome
<execution>
<id>grunt build</id>
<phase>generate-resources</phase>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>firefox chrome</arguments>
</configuration>
</execution>
package.json
这个文件,是nodejs 的文件,会标注 所有需要引入的 类库,类似 jar包。
第一篇文章中,提到的 在项目根目录下 执行命令 npm install ,会访问 package.json 中的 devDependencies,并下载所有的依赖类库。
{
"name": "ingenta-autotest",
"version": "1.0.0",
"description": "This is a test project for Cheng Zong to practise automation test.",
"main": "Gruntfile.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "XinHe <xin.he@ingenta.com>",
"license": "MIT",
"devDependencies": {
"chai": "^3.5.0",
"cucumber": "^1.0.0",
"grunt": "^1.0.1",
"grunt-cli": "^1.2.0",
"grunt-contrib-jshint": "^1.0.0",
"grunt-env": "^0.4.4",
"grunt-exec": "^0.4.7",
"sanitize-filename": "^1.6.0",
"selenium-webdriver": "^2.53.2"
}
}
Gruntfile.js
这个文件,就是 grunt .
详细解释,看官方文档。
Grunt 快速入门
在系统中的用法,主要有两点。 启动项目的 grunt chrome or grunt firefox 命令,就是直接访问这个文件。
以下是此文件 测试demo 中 所有代码。
'use strict';
var path = require('path');
module.exports = function(grunt) {
grunt.initConfig({
tag_chrome : '--tags @first', // 在 demo 代码分析 那篇博客中,在 .feature 文件中,标注过 @first标签,下文解释。
tag_firefox : '',
env : {
chrome : {
PLATFORM : 'CHROME'
},
firefox : {
PLATFORM : 'FIREFOX'
}
},
jshint : {
all : [ 'Gruntfile.js', 'features/step_definitions/*.js', 'features/support/*.js' ],
options : {
node : true,
strict : true,
globalstrict : true
}
},
exec : {
run_chrome : {
command : 'node ' + path.join('node_modules', 'cucumber', 'bin', 'cucumber.js -f pretty <%= tag_chrome %>')
},
run_firefox : {
command : 'node ' + path.join('node_modules', 'cucumber', 'bin', 'cucumber.js -f pretty <%= tag_firefox %>')
},
run_help : {
command : 'node ' + path.join('node_modules', 'cucumber', 'bin', 'cucumber.js --help')
},
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-exec');
grunt.loadNpmTasks('grunt-env');
grunt.registerTask('default', [ 'jshint', 'exec:run_help' ]);
grunt.registerTask('chrome', [ 'env:chrome', 'jshint', 'exec:run_chrome' ]);
grunt.registerTask('firefox', [ 'env:firefox', 'jshint', 'exec:run_firefox' ]);
grunt.registerTask('asdf666', [ 'env:firefox', 'jshint', 'exec:run_firefox' ]);
};
文件结构,就不解释了,官方文档,这里解释这么几点。
1、@first 标签,在feature文件中,每个测试 单元,都可以进行标注标签。 标签的作用是,说明,这个测试单元,在什么环境下会进行。如果有多个测试单元,只有一个标注了@first ,则,当你运行 命令 grunt chrome ,只会执行标注 标签的 测试单元。
2、grunt.registerTask ,在用命令 grunt chrome 启动测试用例,会找到对应的registerTask ,可以使用命令 grunt --help ,会提示所有命令,包括registerTask 中设置的。
W:\AutoTestProject\LawEditorial-autotest>grunt --help
Grunt: The JavaScript Task Runner (v1.0.1)
Usage
grunt [options] [task [task ...]]
Options
--help, -h Display this help text.
Options marked with * have methods exposed via the grunt API and should instead
be specified inside the Gruntfile wherever possible.
Available tasks
jshint Validate files with JSHint. *
exec Execute shell commands. *
env Specify an ENV configuration for future tasks in the chain *
default Alias for "jshint", "exec:run_help" tasks.
chrome Alias for "env:chrome", "jshint", "exec:run_chrome" tasks.
firefox Alias for "env:firefox", "jshint", "exec:run_firefox" tasks.
asdf666 Alias for "env:firefox", "jshint", "exec:run_firefox" tasks.
Tasks run in the order specified. Arguments may be passed to tasks that accept
them by using colons, like "lint:files". Tasks marked with * are "multi tasks"
and will iterate over all sub-targets if no argument is specified.
The list of available tasks may change based on tasks directories or grunt
plugins specified in the Gruntfile or via command-line options.
For more information, see http://gruntjs.com/
***************
PS:上面 代码块,我去掉了一部分Options。
可以看到,Available tasks 下面,包含 我在Gruntfile.js中,定义的所有registerTask
***************
3、jshint,这个我还没有研究明白,以后补充。
world.js
1、项目中world.js 的作用,是,抽象封装了一些公共方法,以及一些必须实现的基础方法 base method。类似 ,所有Controller 都继承 的那个 BaseController。
2、最重要的作用,就是,对Gruntfile.js 文件中,registerTask 标注的,进行详细的解释。
这个文件比较重要,贴出demo中所有代码:
'use strict';
var fs = require('fs');
var webdrive = require('selenium-webdriver');
var platform = process.env.PLATFORM || "FIREFOX";
var buildChromedrive = function() {
return new webdrive.Builder().withCapabilities(
webdrive.Capabilities.chrome()).build();//.usingServer('http://127.0.0.1:64465/')
};
var buildFirefoxdrive = function() {
return new webdrive.Builder().withCapabilities(
webdrive.Capabilities.firefox()).build();//.usingServer('http://127.0.0.1:64465/')
};
switch (platform) {
case 'FIREFOX':
var drive = buildFirefoxdrive();
break;
case 'CHROME':
var drive = buildChromedrive();
drive.manage().window().setSize(1920,1080);
break;
default:
var drive = buildChromedrive();
}
var getdrive = function() {
return drive;
};
var World = function World() {
var defaultTimeout = 60000;
var screenshotPath = "screenshots";
drive.manage().timeouts().implicitlyWait(50000);
this.webdrive = webdrive;
this.drive = drive;
if (!fs.existsSync(screenshotPath)) {
fs.mkdirSync(screenshotPath);
}
this.waitForId = function(idLocator, elementName) {
var errMsg = elementName + ' was still not present when it should have appeared.';
return drive.wait(function() {
return drive.isElementPresent({ id : idLocator }) &&
drive.findElement({ id : idLocator }).isDisplayed().then(function (displayed) {
if (!displayed) return false;
return drive.findElement({ id : idLocator }).isEnabled();
});
}, defaultTimeout, errMsg);
};
this.waitForCss = function(cssLocator, elementName) {
var errMsg = elementName + ' was still not present when it should have appeared.';
return drive.wait(function() {
return drive.isElementPresent({ css : cssLocator }) &&
drive.findElement({ css : cssLocator }).isDisplayed().then(function (displayed) {
if (!displayed) return false;
return drive.findElement({ css : cssLocator }).isEnabled();
});
}, defaultTimeout, errMsg);
};
this.waitForXpath = function(xpathLocator, elementName) {
var errMsg = elementName + ' was still not present when it should have appeared.';
return drive.wait(function() {
return drive.isElementPresent({ xpath : xpathLocator }) &&
drive.findElement({ xpath : xpathLocator }).isDisplayed().then(function (displayed) {
if (!displayed) return false;
return drive.findElement({ xpath : xpathLocator }).isEnabled();
});
}, defaultTimeout, errMsg);
};
};
module.exports.World = World;
module.exports.getdrive = getdrive;
1、首先,switch,会根据 在 gruntfile.js 中,指定的registerTask ,进行筛选,并启动不同的driver ,firefox 或者 chrome。
******************PS:这里的 driver ,就是 selenium - webdriver 。
2、其次,var World = function World() 方法。
就是封装的一些方法 ,供 logintest.page.js 调用,可以自己定义 一些工具方法,写在这个方法下。
demo中的三个方法 1、this.waitForId 2、this.waitForCss 3、this.waitForXpath。 这三个方法的意思是,
等待某些元素加载完成,适用情况很简单,比如网速不好的时候,你不知道 某个 input 输入框,或者 某个 button 按钮,在什么时候加载完成。
但是,你可以根据 这个控件 的ID,或者CSS ,或者 Xpath ,来设置,等这个控件加载完成后,才继续执行测试。
************PS: 说一下Xpath。*************
自己百度什么是xpath 。
xpath 教程 下载:http://share.weiyun.com/29efd2f50d8f2b0cb093c97b5b4efc31
在谷歌浏览器,可以直接获取xpath 信息。在 F12 控制台 的 Element 中,找到对应元素的 html 代码。右键 Copy --> Copy Xpath
复制出来的就是 xpath 地址 //*[@id="article_details"]/div[2]/div[2]/span[5]/a
*************************x path end ***************************************************************
现在,结合 worle.js 再去看 logintest.step.js 和 logintest.page.js ,可以看出。
在 step 文件中,在所有的实现业务逻辑方法中,
用到的公共元素,可以提取到page.js 中,
用到的公共方法,提取到world.js 中使用。
that‘s all
分享到:
相关推荐
### 接口自动化测试方案详解 #### 一、测试需求及范围 **1.1 测试目的** 随着公司的快速发展和技术的不断进步,项目规模日益扩大,接口服务也随之增多。为了确保系统的稳定性和可靠性,需要定期对接口进行回归...
通过学习这个“自动化测试学习文档”,初学者可以逐步掌握自动化测试的基本技能,并能够运用到实际项目中去,提升测试效率,降低手动测试的工作量,从而更好地保证软件质量。在学习过程中,结合实战案例和不断实践是...
最后,作者会分享一些实际项目中的自动化测试策略和最佳实践,帮助读者将理论知识应用于实际工作中,解决自动化测试过程中可能遇到的问题。 总之,《QTP自动化测试实践》是一本实用性强、内容丰富的教程,无论是对...
QTP,全称为QuickTest Professional,现在被称为UFT(Unified Functional Testing),是HP公司推出的一种功能强大的自动化测试工具,主要用于执行基于Windows平台的软件应用的功能测试和回归测试。它支持多种应用...
QTP,全称QuickTest Professional,是HP(现为Micro Focus)公司开发的一款功能强大的自动化测试工具,广泛应用于功能测试和回归测试,尤其在企业级软件项目中应用颇广。 这本书的核心内容可能包括以下几个方面: ...
【Python自动化测试基础与实战教程概述】 Python自动化测试是一门技术性强、实用性高的学科,尤其适合初学者。本文将从Python编程基础、自动化测试工具的使用以及实战技巧三个方面,逐步介绍如何快速掌握Python自动...
在自动化测试中,效率和项目流程同样重要,高效的团队合作和成员的积极性对于项目的成功有着不可或缺的作用。本文的内容旨在激发和启发读者对后端自动化测试的兴趣和热情,并对如何高效地构建测试流程提供指导。通过...
**QTP(QuickTest Professional,现称为UFT:Unified Functional Testing)是HP公司推出的一款功能强大的自动化测试工具,尤其在Web、桌面应用和SAP等领域的自动化测试中有广泛应用。本篇将详细介绍UFT(QTP)中的三...
《612931 腾讯Android自动化测试实战》是腾讯公司推出的关于Android自动化测试的专业教程,旨在帮助开发者和测试工程师掌握Android应用的自动化测试技术。这本高清版的教程带有详细的目录,便于读者按照章节进行系统...
本章还介绍了IBM-Rational、Mercury Interactive(现为HP)和Compuware等公司的自动化测试产品,这些解决方案涵盖了从需求管理、测试设计、脚本编写到测试执行和结果分析的全过程,为企业提供了一站式的测试自动化...
本教程“零基础学习软件测试——自动化测试工具LoadRunner”旨在帮助初学者快速掌握LoadRunner的基本操作和应用。 LoadRunner的核心功能包括以下几点: 1. **虚拟用户生成器(VUGen)**:VUGen用于录制和回放用户...
Appium是一款非常流行的开源工具,用于对移动应用程序进行自动化测试。它支持iOS、Android和Firefox OS上的原生、混合和Web应用程序的自动化测试,且不依赖源代码,也不限制测试框架和平台。 首先,我们要了解...
Appium 是一个用于移动设备自动化测试的开源工具,它支持 iOS、Android 和 Firefox OS ...同时,Appium 作为一个开源项目,其社区活跃且持续提供更新和支持,这也是它能够在众多自动化测试框架中脱颖而出的原因之一。
3. 编程语言基础:自动化测试通常基于编程语言实现,如Java、Python、C#,熟悉至少一种语言的基本语法和数据类型。 二、自动化测试工具 1. Selenium:详细讲解Selenium WebDriver的工作原理,如何配置环境,编写...
### Selenium自动化测试工具知识点 #### 一、Selenium概述 Selenium是一款强大的Web应用程序测试工具,主要用于自动化Web应用测试。该工具由ThoughtWorks公司开发,支持多种浏览器如Internet Explorer、Mozilla ...
具体到UFT工具的使用,自动化测试工程师必须熟悉其基本操作,包括但不限于获取和分析测试需求、配置测试环境、录制和修改测试脚本、运行测试以及结果分析等。此外,测试框架的设计还应考虑测试数据管理,例如数据...
Dagger是网易杭州研究院QA团队开发的一个轻量级、运行稳定的WebUI自动化测试框架,主要基于Selenium及TestNg可以认为是对Selenium进行二次封装的一个框架(俗称 造轮子 )。之所以把这个轮子开源出来,主要在于...
**QTP(QuickTest Professional)**,现在被称为UFT(Unified Functional Testing),是HP公司推出的一款功能强大的自动化测试工具,主要用于软件的功能测试和回归测试。它适用于多种应用程序,包括Web、桌面、移动...