什么时候做自动化测试试的时候,检查调用某个方法时是否有log打出

\ Selenium+Java自动化测试常用的方法
Selenium+Java自动化测试常用的方法
软件测试工程师
任何时候都别怕重来,每个看似低的起点,都是通往高峰的必经之路。你不努力,谁又能替你成长?
作者的热门手记
1.设置等待时间
Thread.sleep(2000); (1000代表1s)
2.断言assertion:
验证应用程序的状态是否同所期望的一致。
常见的断言包括:验证页面内容,如标题是否为X或当前位置是否正确,或是验证该复选框是否被勾选。
断言被用于三种模式: assert 、verify、waitfor
Assert 失败时,该测试将终止。
Verify 失败时,该测试将继续执行,并将错误记入日显示屏 。也就是说允许此单个 验证通过。确保应用程序在正确的页面上。
Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试。
如果该条件为真,他们将立即成功执行。如果该条件不为真,则将失败并暂停测试。直到超过当前所设定的超时时间。 一般跟setTimeout时间一起用
断言常用的有:
assertLocation(判断当前是在正确的页面)、
assertTitle(检查当前页面的title是否正确)、
assertValue(检查input的值, checkbox或radio,有值为”on”无为”off”)、
assertSelected(检查select的下拉菜单中选中是否正确)、
assertSelectedOptions(检查下拉菜单中的选项的是否正确)、
assertText(检查指定元素的文本)、
assertTextPresent(检查在当前给用户显示的页面上是否有出现指定的文本)、
assertTextNotPresent(检查在当前给用户显示的页面上是否没有出现指定的文本)、
assertAttribute(检查当前指定元素的属性的值)、
assertTable(检查table里的某个cell中的值)、
assertEditable(检查指定的input是否可以编辑)、
assertNotEditable(检查指定的input是否不可以编辑)、
assertAlert(检查是否有产生带指定message的alert对话框)、
waitForElementPresent (等待检验某元素的存在。为真时,则执行。)
最常用的unittest断言如下:
1.相等断言:assertEqual(self, first, second, msg=None)  常用于title和url的对比来检查是否与预期结果一致;
 self.assertEqual(u'用户 - Delicate Cloud Dashboard', driver.title, 'switch to Admin_Identity_User panel fail')
2.不等断言:assertNotEqual(self, first, second, msg=None)  与1相反,此断言不常用;
3.True断言:assertTrue(self, expr, msg=None)     此断言可用于对寻找某元素的表达式进行判断,如返回True则通过,否则Fail;
4.False断言:assertFalse(self, expr, msg=None)    此断言可用于对寻找某元素的表达式进行判断,如返回False则通过,否则Fail;
3和4可以配合使用selenium IDE所生成的Python脚本中is_element_present和is_alert_present来使用;
selenium元素的定位以及操作
元素的定位
自动化,我们需要做的最基本的事情就是在页面找到元素并通过脚本程
序去操作这个元素,实现模拟人工操作。我们有多种定位元素的方式可以选择:
通过元素的
ID定位元素:
findElement(By.id(element));
通过元素的名称定位元素:
findElement(By.name(element));
通过元素的html中的位置定位元素:
findElement(By.xpath(element));
通过元素的标签名称定位元素:
findElement(By.tagName(element));
通过元素的链接名称定位元素:
findElement(By.linkText(element));
通过元素的类名定位元素:
findElement(By.className(element));
通过元素的css定位元素:
findElement(By.cssSelector(element));
通过元素的部分链接名称定位元素:
findElement(By.partialLinkText(element));
元素的操作
不同的元素我们进行不同的操作,按钮的点击、输入框的字符输入、或者是元素的内
容获取,不同的元素我们操作的方式不一。
对ID为element的元素进行点击操作:
driver.findElement(By.id(element)).click();
对ID为element的元素进行发送字符操作:
driver.findElement(By.id(element)).sendKeys(“XXXXXX”);
这里只举用的最多且最简单的的两例元素的操作,
还有的是先获取元素后,再单独操作
WebElement text1 = driver.findElement(By.name(&password&));
text1.sendKeys(&123456&);
3.页面操作
模拟鼠标点击:driver.click();
打开网页:driver.get(&&);
关闭网页:driver.close();
在输入框中输入内容:text.sendKeys(“”);
清空输入框中的内容:text.clear();
获取输入框中的内容:text.getText();
选择下拉框中的元素:
Select select = new Select(wd.findElement(By.id(&select&)));
切换到某个frame:
driver.switchTo().frame(&&);
从一个frame切换到另一个frame:
driver.switchTo().frame(&&);
切换到某个window:
driver.switchTo().window(&windowName&);
返回父iframe:(一般在跳转frame之前都写上这个语句)
driver.switchTo().defaultContent();
刷新页面:driver.navigate().refresh();
页面前进后退:
driver.navigate().forward();
driver.navigate().back();
悬停鼠标:
1.5.1输入框(text field or textarea)WebElement element = driver.findElement(By.id(&passwd-id&));
* element.sendKeys(“test”);//在输入框中输入内容:
* element.clear();    
//将输入框清空
* element.getText();  
//获取输入框的文本内容:
1.5.2下拉选择框(Select)Select select = new Select(driver.findElement(By.id(&select&)));
* select.selectByVisibleText(“A”);
* select.selectByValue(“1”);
* select.deselectAll();
* select.deselectByValue(“1”);
* select.deselectByVisibleText(“A”);
* select.getAllSelectedOptions();
* select.getFirstSelectedOption();
1.5.3单选项(Radio Button)WebElement radio=driver.findElement(By.id(&BookMode&));
* radio.click();    
//选择某个单选项
* radio.clear();    
//清空某个单选项
* radio.isSelected();  //判断某个单选项是否已经被选择
1.5.4多选项(checkbox)WebElement checkbox = driver.findElement(By.id(&myCheckbox.&));
* checkbox.click();
* checkbox.clear();
* checkbox.isSelected();
* checkbox.isEnabled();
1.5.5按钮(button)WebElement btn= driver.findElement(By.id(&save&));
* btn.click();      //点击按钮
* btn.isEnabled ();  //判断按钮是否enable
1.5.7弹出对话框(Popup dialogs)Alert alert = driver.switchTo().alert();
* alert.accept();  //确定
* alert.dismiss();  //取消
* alert.getText(); //获取文本
1.5.8表单(Form)  Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:
  WebElement approve = driver.findElement(By.id(&approve&));
  approve.click();
  approve.submit();//只适合于表单的提交
1.5.9上传文件上传文件的元素操作:
  WebElement adFileUpload =driver.findElement(By.id(&WAP-upload&));
  String filePath = &C:\test\uploadfile\media_ads\test.jpg&;
  adFileUpload.sendKeys(filePath);
Windows 和 Frames之间的切换
driver.switchTo().defaultContent();     //返回到最顶层的frame/iframe
driver.switchTo().frame(&leftFrame&);    //切换到某个frame:
driver.switchTo().window(&windowName&); //切换到某个window
调用Java ScriptWeb driver对Java Script的调用是通过JavascriptExecutor来实现的,例如:
JavascriptExecutor js = (JavascriptExecutor)
js.executeScript(&JS脚本&);
超时设置 WebDriver driver = new FirefoxDriver();
* driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);    
//识别元素时的超时时间
* driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);  //页面加载时的超时时间
* driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);  //异步脚本的超时时间
相关标签:
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
Copyright (C)
All Rights Reserved | 京ICP备 号-2自动化测试Java六:Selenium测试方案 - 简书
自动化测试Java六:Selenium测试方案
自动化测试方案
自动化测试方案
自动化测试框架图
Selenium自动化测试方案.png
测试用例使用单元测试框架
测试业务使用 Page-Object 设计模式
测试数据使用 数据驱动的方式 进行传入
SQL Server
底层封装 WebDriver
测试用例组织与执行
测试集合 test suite
测试用例的集合
多个测试用例的类
测试用例类的方法
测试运行 运行 test suite
testng.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"&
&suite name="Default Suite"&
&test name="SolutionSelenium"&
&class name="cases.LoginTests"&
&!-- 添加指定的测试 --&
&include name="testLoginByCsv"/&
&include name="testLoginByCsv2"/&
&include name="testLoginByCsv3"/&
&/methods&
&/class& &!-- cases.LoginTests --&
&class name="cases.AdminTests"&
&!-- 去除指定的测试 --&
&exclude name="testAddMember"/&
&/methods&
&/classes&
&/test& &!-- SolutionSelenium --&
&/suite& &!-- Default Suite --&
指定测试的类
指定测试的类中的方法
include: 一个个方法包含进来
exclude: 去除指定的方法
public class Main {
public static void main(String[] args) {
TestNG test = new TestNG();
List&String& suites = new ArrayList&&();
suites.add("testng.xml");
test.setTestSuites(suites);
test.run();
TestNG 自带的测试报告 xml / html
ReportNG 测试报告的插件,停止开发和支持。
Report detail page.
ExtentReport 测试报告
TestNG有默认的测试报告生成器 Listener
使用 ExtentReport 重写一个 Listener
让 TestNG 使用我们写好的 Listener 生成报告
引入 ExtentReport 到 pom.xml
&dependency&
&groupId&com.relevantcodes&/groupId&
&artifactId&extentreports&/artifactId&
&version&2.41.2&/version&
&/dependency&
目前 ExtentReport 有两个版本:2 和 3
2 全部开源的
3 有付费版和开源版
官方网址:
编写 Listener : ExtentReporterNgListener
public void generateReport(List&XmlSuite& xmlSuites, List&ISuite& suites, String outputDirectory) {
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_HHmmss");
String time = formatter.format(date);
String reportName = String.format("ExtentReportTestNG_%s.html", time);
// 创建报告
// NetworkMode.OFFLINE 支持断网查看报告
this.extent = new ExtentReports(
outputDirectory + File.separator + reportName,
true, NetworkMode.OFFLINE);
for (ISuite suite : suites) {
Map&String, ISuiteResult& result = suite.getResults();
for (ISuiteResult r : result.values()) {
ITestContext context = r.getTestContext();
// 创建测试节点
buildTestNodes(context.getPassedTests(), LogStatus.PASS);
buildTestNodes(context.getFailedTests(), LogStatus.FAIL);
buildTestNodes(context.getSkippedTests(), LogStatus.SKIP);
extent.flush();
extent.close();
修改 testng.xml
在&suite /& 中添加 &listener/&
&listeners&
&listener class-name="runner.ExtentReporterNgListener"/&
&/listeners&
正常运行测试
添加 test suite
suite = unittest.TestSuite()
suite.addTest(LoginTests("test_login_by_csv"))
suite.addTest(LoginTests("test_login_by_csv2"))
suite.addTest(AdminTests("test_add_member_by_csv"))
这里可以配置测试,到外部文件,数据库中等。
测试类,测试方法
LoginTests,test_login_by_csv
LoginTests,test_login_by_csv2
AdminTests,test_add_member_by_csv
实例化 test runner
# 测试报告的文件
test_time = time.strftime("%Y%m%d_%H%M%S", time.localtime())
report_file = open("reports\\ranzhi_automate_report_%s.html" % test_time,
mode="wb")
runner = HtmlTestRunner(stream=report_file,
verbosity=2,
title="然之系统自动化测试报告",
description="具体测试报告内容如下: ")
HtmlTestRunner : 第三方测试报告运行器
用 test runner 去执行测试,产生报告。
runner.run(suite)
项目中符合自动化测试的部分有哪些?(目标和范围 scope, 准入准出标准)
稳定的需求点、变动较少的页面
每日构建后的测试验证 daily build
比较频繁的回归测试
需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务
自动化用例在整个项目的测试用例的覆盖率
一般的要求 50% +
重点的要求 80% +
根据项目的具体要求,变动特别大的项目需要额外单独考虑覆盖率
建立自动化测试的组,理想状态下有4个人员,测试开发、中高级自动化测试工程师、2个初级自动化工程师;非理想的情况下,可能只有一个人。
测试开发:
基础答案:自动化框架的建设,确定自动化框架的设计模式、第三方代码工具的封装、中间公共模块的设计和调用、测试用例、测试套件的管理和执行、测试报告和测试结果的输出(文件输出和邮件通知)
可选高级:如果可能的话,需要搭建持续集成服务器(CI,Continuous Integration Server)的环境,进行持续交付和自动化的冒烟测试等。
培训的任务,需要将设计的框架以及封装的驱动,对其他成员进行培训。
有自动化方案的实施经验、有开发背景、以及持续集成的背景等。
中高级自动化测试工程师:
配合测试开发人员,实施测试框架的建设。主要负责中间公共模块的实现和实例化等,以及部分高难度和流程复杂的自动化用例脚本编写和调试等工作。
有参与过自动化方案的建设、脚本编写经验丰富、会代码调试、懂Web测试等。
初级自动化测试工程师:根据中间公共模块的设计,进行实例化公共模块、方法组合,实现自动化用例脚本的编写。有计算机编程思维、有代码经验、可以读懂脚本和HTML等。
若只有我一个人:首先实现自动化用例的维护和执行。在这个基础上不断的抽取实现公共模块的设计以及测试报告的生成等工作。通过经验的积累,以及后续人员的补充,早日做好自动化框架的建设工作。
Selenium WebDriver、Python(unittest) Java(JUnit、TestNG)、CI Server
技术方案:选择Python + Selenium 或者 Java + Selenium 的技术方案。
首先技术工具是免费的,Python的工具用PyCharm社区版,Selenium的WebDriver是开源工具。利用比较简洁的Python语言进行自动化测试,对于人员的学习成本来讲比较实用,学习时间短,有优势。
另外Python自带的unittest单元测试框架可以很方便的实现自动化用例的设计和执行以及自动化用例套件的管理等任务。Python是纯面向对象的语言,后续也可以过渡到Java + Selenium进行更加丰富的自动化测试。此外,可以选择Jenkins作为持续集成服务器,配合Python+Selenium的方案进行自动化冒烟测试。
硬件:硬件的要求不高,主要需要独立的测试环境。另外测试人员用的电脑最好是Windows桌面操作系统,需要安装Firefox浏览器,避免47.0的最新版本。测试人员最好也使用Chrome浏览器辅助进行Web元素的定位。
持续集成的概念
持续集成的定义
持续集成,Continuous integration ,简称CI。
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
持续集成正是针对这一类问题的一种软件开发实践。首先我们看一下,敏捷教父 Martin Fowler 对持续集成的定义:
Martin Fowler:Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.
具体定义:持续集成式一种软件开发实践。它倡导团队的成员必须经常的集成他们的工作,通常至少每天一次甚至更多次集成。每次集成都需要通过自动化的构建(包括编译代码、构建应用、部署程序以及自动化测试)来验证,从而尽早尽快的发现集成中的错误。大量的团队利用这样的方式来更快的开发内聚的软件。大大减少此过程中的集成问题。
具体的流程图如下:
Paste_Image.png
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元、自动化)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
首先,解释下集成。我们所有项目的代码都是托管在SVN服务器上。每个项目都要有若干个单元测试,并有一个所谓集成测试。所谓集成测试就是把所有的单元测试跑一遍以及其它一些能自动完成的测试。只有在本地电脑上通过了集成测试的代码才能上传到SVN服务器上,保证上传的代码没有问题。所以,集成指集成测试。
再说持续。不言而喻,就是指长期的对项目代码进行集成测试。既然是长期,那肯定是自动执行的,否则,人工执行则没有保证,而且耗人力。对此,我们有一台服务器,它会定期的从SVN中检出代码,并编译,然后跑集成测试。每次集成测试结果都会记录在案。完成这方面工作的就是下面要介绍的Jenkins软件。当然,它的功能远不止这些。在我们的项目中,执行这个工作的周期是1天。也就是,服务器每1天都会准时地对SVN服务器上的最新代码自动进行一次集成测试。
Paste_Image.png
持续集成的特点
它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
需要有专门的集成服务器来执行集成构建;
需要有代码托管工具支持;
持续集成的作用
代码库存越是积压,就越得不到生产检验,积压越多,代码间交叉感染的概率越大,下个发布(release)的复杂度和风险越高,持续集成可以保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
及早的发现代码中的问题,及早解决,代码越早推送(PUSH)出去,用户能越早用到,快就是商业价值;
举个例子,你家装修厨房,其中一项是铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话浪费和返工时间就大了,不如切一块铺一块。装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电路通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要把地砖给挖开……。全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对,返工吗?所以不如没完成一部分,你就去用一下试用验收……这就是持续集成。在敏捷的思想里面,不光强调上面的过程,还需要强调自动化这个过程。过技术手段自动化这三个工作。加快交付速度,自动化测试是一个重要的组成部分。
Jenkins介绍
Jenkins,原名Hudson,2011年改为现在的名字,它 是一个开源的实现持续集成的软件工具。官方网站:。
Hudson是在2004年的夏天由Sun公司开发的(就是开发Java的那家),2005年2月开源并发布了第一个版本。Hudson发布的时候CruiseControl是CI界的老大哥,但是很快,在大约2007年的时候Hudson已经超越CruiseControl。2008年5月的JavaOne大会上,Hudson获得了开发解决方案类的Duke's Choice奖项。从此,小弟翻身做大哥,Hudson成为CI的代名词。
2009年6月,Oracle收购Sun。2010年9月,Oracle注册了Hudson的商标,然后就没有然后了。
mv -f Hudson Jenkins
Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins特点
易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
易配置:提供友好的GUI配置界面;
变更支持:Jenkins能从代码仓库(git/Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);
JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
文件日志信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
支持第三方插件:使得 Jenkins 变得越来越强大;
Jenkins的安装
需要从官网下载Jenkins的文件,在本地安装Java(jdk)的环境以后,直接执行以下语句进行安装:
java -jar jenkins.war
注意上述操作,一定是在Java环境已经配置好的情况下进行。输出如下:
Microsoft Windows [Version 10.0.10532]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Users\erha&java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
C:\Users\erha&java -jar d:\Jenkins\jenkins.war
Running from: D:\Jenkins\jenkins.war
webroot: $user.home/.jenkins
Jun 19, :18 AM winstone.Logger logInternal
INFO: Beginning extraction from war file
Jun 19, :29 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-winstone-2.9
Jun 19, :33 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet
Jenkins home directory: C:\Users\erha\.jenkins found at: $user.home/.jenkins
Jun 19, :35 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started SelectChannelConnector@0.0.0.0:8080
Jun 19, :35 AM winstone.Logger logInternal
INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled
Jun 19, :36 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, :11 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, :12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, :12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, :12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, :15 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, :25 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Started Download metadata
Jun 19, :26 AM org.jenkinsci.main.modules.sshd.SSHD start
INFO: Started SSHD at port 10556
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, :26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, :26 AM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
Jun 19, :32 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Jun 19, :33 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Jun 19, :34 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Ant.AntInstaller
Jun 19, :37 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Jun 19, :37 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 12,471 ms
最后,将Jenkins安装成Windows服务启动
在Jenkins的主页中选择 Manager Jenkins
接下来选择 Install as Windows Service
在Installation Directory中选择jenkin的安装路径。这里会默认产生,直接点击Install就可以了。
随后我们点击Yes,然后可以看到Windows服务中添加了Jenkins的服务,并已经设置为自动和启动状态。
持续集成的实践
创建Jenkins Job
Jenkins提供了四种类型的Job:
构建一个自由风格的软件项目:这个是Jenkins的主要功能,可以构建一个你自己需要的项目。
构建一个maven项目:这是基于maven构建的项目,整个过程将会基于你的.pom文件进行构建,大大减轻构建的配置
构建一个多配置项目:这种项目适用多配置的项目,比如多个平台定制的构建,多个测试环境的部署构建等。
监控一个外部的任务:这种事允许你记录和执行不在Jenkins中的Job,这些Job可以运行在远程的主机上,Jenkins通过远程自动构建,作为一个控制面板而存在。
运行Jenkins Job
运行Job只需要在页面的左侧选中已经列出的项目,进行操作就可以了。选择立即构建,便可以进行自动构建的工作了。
定时构建 Job
目前有一个每日构建的概念。
Daily Build,每日构建。需要Jenkins在每日固定的时间进行代码自动构建、集成和测试的工作。那么需要定制执行时间。Jenkins的自动构建定制时间是遵循cron语法的。具体来说,每一行包括了5个用白空格或者Tab隔开的字段,分别是:MINUTE HOUR DOM MONTH DOW。具体的格式我们参考下图
Minutes within the hour (0–59)
The hour of the day (0–23)
The day of the month (1–31)
The month (1–12)
The day of the week (0–7) where 0 and 7 are Sunday.
然后每个格式,都可以由*,-,/和,4种字符组成:
*代表所有可能的值
-代表整数之间的范围
/代表指定的时间的间隔频率
,代表指定的列表范围
命令的格式参考和示例
执行的命令
python xxx
每个月的1,10,20日的16:00执行 python xxx
命令格式:* 16 1,10,20 * *
python yyy
每个周的周一到周五的16:00执行 python yyy
命令格式:* 16 * * 1-5
python zzz
每个周的周一和周五的17:30执行 python zzz
命令格式:30 17 * * 1,5
ps: 注意时间是伦敦时间
至此,我们将会对Jenkins有一个非常范和初步的了解过程。
1. 创建SVN仓库
https://172.31.95.168/svn/DemoRepo/
ciuser / ciuser
2. 从SVN仓库签出文件到CI Server
3. 构建 build
4.1 备份目标文件夹
若有ranzhi_bak 需要先删除
rd /s /q c:\xampp\htdocs\ranzhi_bak
把 htdoc的ranzhi改成 ranzhi_bak
xcopy c:\xampp\htdocs\ranzhi c:\xampp\htdocs\ranzhi_bak\ /s /e /y
rd /s /q c:\xampp\htdocs\ranzhi
4.2 复制构建的版本到目标文件夹
把workspace的 ranzhi 复制到 htdocs下面
xcopy "%WORKSPACE%\ranzhi" c:\xampp\htdocs\ranzhi\ /s /e /y
4.3 恢复配置文件
复制 ranzhi_bak\config\my.php 到 ranzhi\config\my.php
xcopy c:\xampp\htdocs\ranzhi_bak\config\my.php c:\xampp\htdocs\ranzhi\config\ /e
5. 自动化测试
python D:\Git\Coding\BWFTraining\3.03_Selenium\codes\weekend2demo\ranzhi_test_runner.py
态度决定一切

我要回帖

更多关于 dealloc什么时候调用 的文章

 

随机推荐