自動(dòng)化測(cè)試(12) | Selenium Java 測(cè)試方案

自動(dòng)化測(cè)試方案

自動(dòng)化測(cè)試方案

自動(dòng)化測(cè)試框架圖

Selenium自動(dòng)化測(cè)試方案.png
  1. 測(cè)試用例使用單元測(cè)試框架
  2. 測(cè)試業(yè)務(wù)使用 Page-Object 設(shè)計(jì)模式
  3. 測(cè)試數(shù)據(jù)使用 數(shù)據(jù)驅(qū)動(dòng)的方式 進(jìn)行傳入
    1. flat-file
      1. csv
      2. xml
      3. txt
      4. ...
    2. DataBase
      1. MySQL
      2. SQL Server
      3. MongoDB
  4. 底層封裝 WebDriver

測(cè)試用例組織與執(zhí)行

  • 測(cè)試集合 test suite
    • 測(cè)試用例的集合
      • 多個(gè)測(cè)試用例的類
      • 測(cè)試用例類的方法
  • 測(cè)試運(yùn)行 運(yùn)行 test suite

TestNG

  • 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">
            <classes>
                <class name="cases.LoginTests">
                    <methods>
                          <!-- 添加指定的測(cè)試 -->
                        <include name="testLoginByCsv"/>
                          <include name="testLoginByCsv2"/>
                          <include name="testLoginByCsv3"/>
                    </methods>
                </class> <!-- cases.LoginTests -->
                <class name="cases.AdminTests">
                    <methods>
                          <!-- 去除指定的測(cè)試 -->
                        <exclude name="testAddMember"/>
                    </methods>
                </class>
            </classes>
        </test> <!-- SolutionSelenium -->
    </suite> <!-- Default Suite -->
    
    
    • 指定測(cè)試的類
    • 指定測(cè)試的類中的方法
      • include: 一個(gè)個(gè)方法包含進(jìn)來
      • exclude: 去除指定的方法
  • Main.java

    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();
        }
    }
    
  • 測(cè)試報(bào)告

    • TestNG 自帶的測(cè)試報(bào)告 xml / html

    • ReportNG 測(cè)試報(bào)告的插件轨淌,停止開發(fā)和支持汽纠。

      Report detail page.
    • ExtentReport 測(cè)試報(bào)告

      • TestNG有默認(rèn)的測(cè)試報(bào)告生成器 Listener
        • 使用 ExtentReport 重寫一個(gè) Listener
        • 讓 TestNG 使用我們寫好的 Listener 生成報(bào)告
    • 步驟

      • 引入 ExtentReport 到 pom.xml

        <dependency>
          <groupId>com.relevantcodes</groupId>
          <artifactId>extentreports</artifactId>
          <version>2.41.2</version>
        </dependency>
        
      • 編寫 Listener : ExtentReporterNgListener

        @Override
        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);
          // 創(chuàng)建報(bào)告
          // NetworkMode.OFFLINE 支持?jǐn)嗑W(wǎng)查看報(bào)告
          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();
              // 創(chuàng)建測(cè)試節(jié)點(diǎn)
              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>
        
      • 正常運(yùn)行測(cè)試

unittest

  • 添加 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"))
    
    • 這里可以配置測(cè)試,到外部文件帜乞,數(shù)據(jù)庫中等捡多。

      測(cè)試類,測(cè)試方法
      LoginTests,test_login_by_csv
      LoginTests,test_login_by_csv2
      AdminTests,test_add_member_by_csv
      

      ?

  • 實(shí)例化 test runner

    # 測(cè)試報(bào)告的文件
    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="然之系統(tǒng)自動(dòng)化測(cè)試報(bào)告",
                            description="具體測(cè)試報(bào)告內(nèi)容如下: ")
    

    HtmlTestRunner : 第三方測(cè)試報(bào)告運(yùn)行器

  • 用 test runner 去執(zhí)行測(cè)試蓖康,產(chǎn)生報(bào)告。

    runner.run(suite)
    

    ?

項(xiàng)目討論

  • 項(xiàng)目中符合自動(dòng)化測(cè)試的部分有哪些垒手?(目標(biāo)和范圍 scope蒜焊, 準(zhǔn)入準(zhǔn)出標(biāo)準(zhǔn))
    • 穩(wěn)定的需求點(diǎn)、變動(dòng)較少的頁面
    • 每日構(gòu)建后的測(cè)試驗(yàn)證 daily build
    • 比較頻繁的回歸測(cè)試
    • 需要在多平臺(tái)上運(yùn)行的相同測(cè)試案例科贬、組合遍歷型的測(cè)試泳梆、大量的重復(fù)任務(wù)
  • 自動(dòng)化用例在整個(gè)項(xiàng)目的測(cè)試用例的覆蓋率
    • 一般的要求 50% +
    • 重點(diǎn)的要求 80% +
    • 根據(jù)項(xiàng)目的具體要求,變動(dòng)特別大的項(xiàng)目需要額外單獨(dú)考慮覆蓋率

團(tuán)隊(duì)建設(shè)

建立自動(dòng)化測(cè)試的組榜掌,理想狀態(tài)下有4個(gè)人員优妙,測(cè)試開發(fā)、中高級(jí)自動(dòng)化測(cè)試工程師憎账、2個(gè)初級(jí)自動(dòng)化工程師套硼;非理想的情況下,可能只有一個(gè)人鼠哥。

  • 測(cè)試開發(fā):

    基礎(chǔ)答案:自動(dòng)化框架的建設(shè)熟菲,確定自動(dòng)化框架的設(shè)計(jì)模式、第三方代碼工具的封裝朴恳、中間公共模塊的設(shè)計(jì)和調(diào)用抄罕、測(cè)試用例、測(cè)試套件的管理和執(zhí)行于颖、測(cè)試報(bào)告和測(cè)試結(jié)果的輸出(文件輸出和郵件通知)

    可選高級(jí):如果可能的話呆贿,需要搭建持續(xù)集成服務(wù)器(CI,Continuous Integration Server)的環(huán)境,進(jìn)行持續(xù)交付和自動(dòng)化的冒煙測(cè)試等做入。

    培訓(xùn)的任務(wù)冒晰,需要將設(shè)計(jì)的框架以及封裝的驅(qū)動(dòng),對(duì)其他成員進(jìn)行培訓(xùn)竟块。

    有自動(dòng)化方案的實(shí)施經(jīng)驗(yàn)壶运、有開發(fā)背景、以及持續(xù)集成的背景等浪秘。

  • 中高級(jí)自動(dòng)化測(cè)試工程師:

    配合測(cè)試開發(fā)人員蒋情,實(shí)施測(cè)試框架的建設(shè)。主要負(fù)責(zé)中間公共模塊的實(shí)現(xiàn)和實(shí)例化等耸携,以及部分高難度和流程復(fù)雜的自動(dòng)化用例腳本編寫和調(diào)試等工作棵癣。

    有參與過自動(dòng)化方案的建設(shè)、腳本編寫經(jīng)驗(yàn)豐富夺衍、會(huì)代碼調(diào)試狈谊、懂Web測(cè)試等。

  • 初級(jí)自動(dòng)化測(cè)試工程師:
    根據(jù)中間公共模塊的設(shè)計(jì)沟沙,進(jìn)行實(shí)例化公共模塊河劝、方法組合,實(shí)現(xiàn)自動(dòng)化用例腳本的編寫矛紫。
    有計(jì)算機(jī)編程思維丧裁、有代碼經(jīng)驗(yàn)、可以讀懂腳本和HTML等含衔。
  • 若只有我一個(gè)人:
    首先實(shí)現(xiàn)自動(dòng)化用例的維護(hù)和執(zhí)行煎娇。在這個(gè)基礎(chǔ)上不斷的抽取實(shí)現(xiàn)公共模塊的設(shè)計(jì)以及測(cè)試報(bào)告的生成等工作。通過經(jīng)驗(yàn)的積累贪染,以及后續(xù)人員的補(bǔ)充缓呛,早日做好自動(dòng)化框架的建設(shè)工作。

技術(shù)方案

Selenium WebDriver杭隙、Python(unittest) Java(JUnit哟绊、TestNG)、CI Server

技術(shù)方案:
選擇Python + Selenium 或者 Java + Selenium 的技術(shù)方案痰憎。

首先技術(shù)工具是免費(fèi)的票髓,Python的工具用PyCharm社區(qū)版,Selenium的WebDriver是開源工具铣耘。利用比較簡(jiǎn)潔的Python語言進(jìn)行自動(dòng)化測(cè)試洽沟,對(duì)于人員的學(xué)習(xí)成本來講比較實(shí)用,學(xué)習(xí)時(shí)間短蜗细,有優(yōu)勢(shì)裆操。

另外Python自帶的unittest單元測(cè)試框架可以很方便的實(shí)現(xiàn)自動(dòng)化用例的設(shè)計(jì)和執(zhí)行以及自動(dòng)化用例套件的管理等任務(wù)怒详。Python是純面向?qū)ο蟮恼Z言,后續(xù)也可以過渡到Java + Selenium進(jìn)行更加豐富的自動(dòng)化測(cè)試踪区。
此外昆烁,可以選擇Jenkins作為持續(xù)集成服務(wù)器,配合Python+Selenium的方案進(jìn)行自動(dòng)化冒煙測(cè)試缎岗。

硬件:
硬件的要求不高静尼,主要需要獨(dú)立的測(cè)試環(huán)境。另外測(cè)試人員用的電腦最好是Windows桌面操作系統(tǒng)传泊,需要安裝Firefox瀏覽器茅郎,避免47.0的最新版本。測(cè)試人員最好也使用Chrome瀏覽器輔助進(jìn)行Web元素的定位或渤。

持續(xù)集成的概念

持續(xù)集成的定義

持續(xù)集成,Continuous integration 奕扣,簡(jiǎn)稱CI薪鹦。

隨著軟件開發(fā)復(fù)雜度的不斷提高,團(tuán)隊(duì)開發(fā)成員間如何更好地協(xié)同工作以確保軟件開發(fā)的質(zhì)量已經(jīng)慢慢成為開發(fā)過程中不可回避的問題惯豆。尤其是近些年來池磁,敏捷(Agile) 在軟件工程領(lǐng)域越來越紅火,如何能再不斷變化的需求中快速適應(yīng)和保證軟件的質(zhì)量也顯得尤其的重要地熄。

持續(xù)集成正是針對(duì)這一類問題的一種軟件開發(fā)實(shí)踐。首先我們看一下芯杀,敏捷教父 Martin Fowler 對(duì)持續(xù)集成的定義:

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.

具體定義:持續(xù)集成式一種軟件開發(fā)實(shí)踐。它倡導(dǎo)團(tuán)隊(duì)的成員必須經(jīng)常的集成他們的工作揭厚,通常至少每天一次甚至更多次集成却特。每次集成都需要通過自動(dòng)化的構(gòu)建(包括編譯代碼、構(gòu)建應(yīng)用筛圆、部署程序以及自動(dòng)化測(cè)試)來驗(yàn)證裂明,從而盡早盡快的發(fā)現(xiàn)集成中的錯(cuò)誤。大量的團(tuán)隊(duì)利用這樣的方式來更快的開發(fā)內(nèi)聚的軟件太援。大大減少此過程中的集成問題闽晦。

具體的流程圖如下:

Paste_Image.png

持續(xù)集成強(qiáng)調(diào)開發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建提岔、(單元仙蛉、自動(dòng)化)測(cè)試。根據(jù)測(cè)試結(jié)果碱蒙,我們可以確定新代碼和原有代碼能否正確地集成在一起捅儒。

首先,解釋下集成。我們所有項(xiàng)目的代碼都是托管在SVN服務(wù)器上巧还。每個(gè)項(xiàng)目都要有若干個(gè)單元測(cè)試鞭莽,并有一個(gè)所謂集成測(cè)試。所謂集成測(cè)試就是把所有的單元測(cè)試跑一遍以及其它一些能自動(dòng)完成的測(cè)試麸祷。只有在本地電腦上通過了集成測(cè)試的代碼才能上傳到SVN服務(wù)器上澎怒,保證上傳的代碼沒有問題。所以阶牍,集成指集成測(cè)試喷面。

再說持續(xù)。不言而喻走孽,就是指長(zhǎng)期的對(duì)項(xiàng)目代碼進(jìn)行集成測(cè)試惧辈。既然是長(zhǎng)期,那肯定是自動(dòng)執(zhí)行的磕瓷,否則盒齿,人工執(zhí)行則沒有保證,而且耗人力困食。對(duì)此边翁,我們有一臺(tái)服務(wù)器,它會(huì)定期的從SVN中檢出代碼硕盹,并編譯符匾,然后跑集成測(cè)試。每次集成測(cè)試結(jié)果都會(huì)記錄在案瘩例。完成這方面工作的就是下面要介紹的Jenkins軟件啊胶。當(dāng)然,它的功能遠(yuǎn)不止這些垛贤。在我們的項(xiàng)目中创淡,執(zhí)行這個(gè)工作的周期是1天。也就是南吮,服務(wù)器每1天都會(huì)準(zhǔn)時(shí)地對(duì)SVN服務(wù)器上的最新代碼自動(dòng)進(jìn)行一次集成測(cè)試琳彩。

Paste_Image.png

持續(xù)集成的特點(diǎn)

  • 它是一個(gè)自動(dòng)化的周期性的集成測(cè)試過程,從檢出代碼部凑、編譯構(gòu)建露乏、運(yùn)行測(cè)試、結(jié)果記錄涂邀、測(cè)試統(tǒng)計(jì)等都是自動(dòng)完成的瘟仿,無需人工干預(yù);
  • 需要有專門的集成服務(wù)器來執(zhí)行集成構(gòu)建比勉;
  • 需要有代碼托管工具支持劳较;

持續(xù)集成的作用

  • 代碼庫存越是積壓驹止,就越得不到生產(chǎn)檢驗(yàn),積壓越多观蜗,代碼間交叉感染的概率越大臊恋,下個(gè)發(fā)布(release)的復(fù)雜度和風(fēng)險(xiǎn)越高,持續(xù)集成可以保證團(tuán)隊(duì)開發(fā)人員提交代碼的質(zhì)量墓捻,減輕了軟件發(fā)布時(shí)的壓力抖仅;
  • 持續(xù)集成中的任何一個(gè)環(huán)節(jié)都是自動(dòng)完成的,無需太多的人工干預(yù)砖第,有利于減少重復(fù)過程以節(jié)省時(shí)間撤卢、費(fèi)用和工作量;
  • 及早的發(fā)現(xiàn)代碼中的問題梧兼,及早解決放吩,代碼越早推送(PUSH)出去,用戶能越早用到羽杰,快就是商業(yè)價(jià)值渡紫;

舉個(gè)例子,你家裝修廚房忽洛,其中一項(xiàng)是鋪地磚,邊角地磚要切割大小环肘。如果一次全切割完再鋪上去欲虚,發(fā)現(xiàn)尺寸有誤的話浪費(fèi)和返工時(shí)間就大了,不如切一塊鋪一塊悔雹。裝修廚房有很多部分复哆,每個(gè)部分都有檢測(cè)手段,如地磚鋪完了要測(cè)試漏水與否腌零,線路鋪完了要通電測(cè)試電路通順梯找,水管裝好了也要測(cè)試?yán)渌疅崴H绻垦b完了再測(cè)益涧,出現(xiàn)問題可能會(huì)互相影響锈锤,比如電路不行可能要把地磚給挖開……。全部裝修完了闲询,你去驗(yàn)收久免,發(fā)現(xiàn)地磚顏色不合意,水池太小扭弧,灶臺(tái)位置不對(duì)阎姥,返工嗎?所以不如沒完成一部分鸽捻,你就去用一下試用驗(yàn)收……這就是持續(xù)集成呼巴。在敏捷的思想里面泽腮,不光強(qiáng)調(diào)上面的過程,還需要強(qiáng)調(diào)自動(dòng)化這個(gè)過程衣赶。過技術(shù)手段自動(dòng)化這三個(gè)工作诊赊。加快交付速度,自動(dòng)化測(cè)試是一個(gè)重要的組成部分屑埋。

Jenkins

Jenkins介紹

Jenkins豪筝,原名Hudson,2011年改為現(xiàn)在的名字摘能,它 是一個(gè)開源的實(shí)現(xiàn)持續(xù)集成的軟件工具续崖。官方網(wǎng)站:http://jenkins-ci.org/

Hudson是在2004年的夏天由Sun公司開發(fā)的(就是開發(fā)Java的那家)团搞,2005年2月開源并發(fā)布了第一個(gè)版本严望。Hudson發(fā)布的時(shí)候CruiseControl是CI界的老大哥,但是很快逻恐,在大約2007年的時(shí)候Hudson已經(jīng)超越CruiseControl像吻。2008年5月的JavaOne大會(huì)上,Hudson獲得了開發(fā)解決方案類的Duke's Choice獎(jiǎng)項(xiàng)复隆。從此拨匆,小弟翻身做大哥,Hudson成為CI的代名詞挽拂。

2009年6月惭每,Oracle收購Sun。2010年9月亏栈,Oracle注冊(cè)了Hudson的商標(biāo)台腥,然后就沒有然后了。

mv -f Hudson Jenkins

Jenkins 能實(shí)施監(jiān)控集成中存在的錯(cuò)誤绒北,提供詳細(xì)的日志文件和提醒功能黎侈,還能用圖表的形式形象地展示項(xiàng)目構(gòu)建的趨勢(shì)和穩(wěn)定性。

Jenkins特點(diǎn)

  • 易安裝:僅僅一個(gè) java -jar jenkins.war闷游,從官網(wǎng)下載該文件后峻汉,直接運(yùn)行,無需額外的安裝脐往,更無需安裝數(shù)據(jù)庫俱济;
  • 易配置:提供友好的GUI配置界面;
  • 變更支持:Jenkins能從代碼倉庫(git/Subversion/CVS)中獲取并產(chǎn)生代碼更新列表并輸出到編譯輸出信息中钙勃;
  • 支持永久鏈接:用戶是通過web來訪問Jenkins的蛛碌,而這些web頁面的鏈接地址都是永久鏈接地址,因此辖源,你可以在各種文檔中直接使用該鏈接蔚携;
  • 集成E-Mail/RSS/IM:當(dāng)完成一次集成時(shí)希太,可通過這些工具實(shí)時(shí)告訴你集成結(jié)果(據(jù)我所知,構(gòu)建一次集成需要花費(fèi)一定時(shí)間酝蜒,有了這個(gè)功能誊辉,你就可以在等待結(jié)果過程中,干別的事情)亡脑;
  • JUnit/TestNG測(cè)試報(bào)告:也就是用以圖表等形式提供詳細(xì)的測(cè)試報(bào)表功能堕澄;
  • 支持分布式構(gòu)建:Jenkins可以把集成構(gòu)建等工作分發(fā)到多臺(tái)計(jì)算機(jī)中完成;
  • 文件日志信息:Jenkins會(huì)保存哪次集成構(gòu)建產(chǎn)生了哪些jars文件霉咨,哪一次集成構(gòu)建使用了哪個(gè)版本的jars文件等構(gòu)建記錄蛙紫;
  • 支持第三方插件:使得 Jenkins 變得越來越強(qiáng)大;

Jenkins的安裝

需要從官網(wǎng)下載Jenkins的文件途戒,在本地安裝Java(jdk)的環(huán)境以后坑傅,直接執(zhí)行以下語句進(jìn)行安裝:

java -jar jenkins.war

注意上述操作,一定是在Java環(huán)境已經(jīng)配置好的情況下進(jìn)行喷斋。輸出如下:

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, 2016 12:52:18 AM winstone.Logger logInternal
INFO: Beginning extraction from war file
Jun 19, 2016 12:52:29 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-winstone-2.9
Jun 19, 2016 12:52: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, 2016 12:52:35 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started SelectChannelConnector@0.0.0.0:8080
Jun 19, 2016 12:52:35 AM winstone.Logger logInternal
INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled
Jun 19, 2016 12:52:36 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, 2016 12:53:11 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, 2016 12:53:15 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, 2016 12:53:25 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Started Download metadata
Jun 19, 2016 12:53:26 AM org.jenkinsci.main.modules.sshd.SSHD start
INFO: Started SSHD at port 10556
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, 2016 12:53:26 AM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
Jun 19, 2016 12:53:32 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Jun 19, 2016 12:53:33 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Jun 19, 2016 12:53:34 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Ant.AntInstaller
Jun 19, 2016 12:53:37 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Jun 19, 2016 12:53:37 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 12,471 ms

隨后訪問http://localhost:8080即可

最后唁毒,將Jenkins安裝成Windows服務(wù)啟動(dòng)

在Jenkins的主頁中選擇 Manager Jenkins

[圖片上傳失敗...(image-3cb7ce-1516465996163)]

接下來選擇 Install as Windows Service

[圖片上傳失敗...(image-63c5a2-1516465996164)]

在Installation Directory中選擇jenkin的安裝路徑。這里會(huì)默認(rèn)產(chǎn)生星爪,直接點(diǎn)擊Install就可以了浆西。

[圖片上傳失敗...(image-69b3c8-1516465996164)]

隨后我們點(diǎn)擊Yes,然后可以看到Windows服務(wù)中添加了Jenkins的服務(wù)顽腾,并已經(jīng)設(shè)置為自動(dòng)和啟動(dòng)狀態(tài)近零。

[圖片上傳失敗...(image-faf91-1516465996164)]

持續(xù)集成的實(shí)踐

創(chuàng)建Jenkins Job

Jenkins提供了四種類型的Job:

  1. 構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目:這個(gè)是Jenkins的主要功能,可以構(gòu)建一個(gè)你自己需要的項(xiàng)目崔泵。
  2. 構(gòu)建一個(gè)maven項(xiàng)目:這是基于maven構(gòu)建的項(xiàng)目秒赤,整個(gè)過程將會(huì)基于你的.pom文件進(jìn)行構(gòu)建猪瞬,大大減輕構(gòu)建的配置
  3. 構(gòu)建一個(gè)多配置項(xiàng)目:這種項(xiàng)目適用多配置的項(xiàng)目憎瘸,比如多個(gè)平臺(tái)定制的構(gòu)建,多個(gè)測(cè)試環(huán)境的部署構(gòu)建等陈瘦。
  4. 監(jiān)控一個(gè)外部的任務(wù):這種事允許你記錄和執(zhí)行不在Jenkins中的Job幌甘,這些Job可以運(yùn)行在遠(yuǎn)程的主機(jī)上,Jenkins通過遠(yuǎn)程自動(dòng)構(gòu)建痊项,作為一個(gè)控制面板而存在锅风。

運(yùn)行Jenkins Job

運(yùn)行Job只需要在頁面的左側(cè)選中已經(jīng)列出的項(xiàng)目,進(jìn)行操作就可以了鞍泉。選擇立即構(gòu)建皱埠,便可以進(jìn)行自動(dòng)構(gòu)建的工作了。

定時(shí)構(gòu)建 Job

目前有一個(gè)每日構(gòu)建的概念咖驮。

Daily Build边器,每日構(gòu)建训枢。需要Jenkins在每日固定的時(shí)間進(jìn)行代碼自動(dòng)構(gòu)建、集成和測(cè)試的工作忘巧。那么需要定制執(zhí)行時(shí)間恒界。Jenkins的自動(dòng)構(gòu)建定制時(shí)間是遵循cron語法的。具體來說砚嘴,每一行包括了5個(gè)用白空格或者Tab隔開的字段十酣,分別是:MINUTE HOUR DOM MONTH DOW。具體的格式我們參考下圖

字段 說明 示例
MINUTE Minutes within the hour (0–59) 30
HOUR The hour of the day (0–23) 17
DOM The day of the month (1–31) 1
MONTH The month (1–12) 5
DOW The day of the week (0–7) where 0 and 7 are Sunday. 5

然后每個(gè)格式际长,都可以由*耸采,-/,4種字符組成:

  • *代表所有可能的值
  • -代表整數(shù)之間的范圍
  • /代表指定的時(shí)間的間隔頻率
  • ,代表指定的列表范圍

命令的格式參考和示例

分鐘 小時(shí) 月份 星期 執(zhí)行的命令
* 16 1,10,20 * * python xxx 每個(gè)月的1也颤,10洋幻,20日的16:00執(zhí)行 python xxx 命令格式:* 16 1,10,20 * *
* 16 * * 1-5 python yyy 每個(gè)周的周一到周五的16:00執(zhí)行 python yyy 命令格式:* 16 * * 1-5
30 17 * * 1,5 python zzz 每個(gè)周的周一和周五的17:30執(zhí)行 python zzz 命令格式:30 17 * * 1,5

ps: 注意時(shí)間是倫敦時(shí)間

至此翅娶,我們將會(huì)對(duì)Jenkins有一個(gè)非常范和初步的了解過程文留。

示例:

1. 創(chuàng)建SVN倉庫 
    https://172.31.95.168/svn/DemoRepo/
    ciuser / ciuser
2. 從SVN倉庫簽出文件到CI Server
3. 構(gòu)建 build
4. 部署 
    4.1 備份目標(biāo)文件夾 
        若有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 復(fù)制構(gòu)建的版本到目標(biāo)文件夾
        把workspace的 ranzhi 復(fù)制到 htdocs下面
        xcopy "%WORKSPACE%\ranzhi" c:\xampp\htdocs\ranzhi\ /s /e /y
    4.3 恢復(fù)配置文件
        復(fù)制 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. 自動(dòng)化測(cè)試
    python D:\Git\Coding\BWFTraining\3.03_Selenium\codes\weekend2demo\ranzhi_test_runner.py
    

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竭沫,隨后出現(xiàn)的幾起案子燥翅,更是在濱河造成了極大的恐慌,老刑警劉巖蜕提,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件森书,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谎势,警方通過查閱死者的電腦和手機(jī)凛膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脏榆,“玉大人猖毫,你說我怎么就攤上這事⌒胛梗” “怎么了吁断?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坞生。 經(jīng)常有香客問我仔役,道長(zhǎng),這世上最難降的妖魔是什么是己? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任又兵,我火速辦了婚禮,結(jié)果婚禮上卒废,老公的妹妹穿的比我還像新娘沛厨。我一直安慰自己乘盼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布俄烁。 她就那樣靜靜地躺著绸栅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪页屠。 梳的紋絲不亂的頭發(fā)上粹胯,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音辰企,去河邊找鬼风纠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牢贸,可吹牛的內(nèi)容都是我干的竹观。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼潜索,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼臭增!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竹习,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤誊抛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后整陌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拗窃,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年泌辫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了随夸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡震放,死狀恐怖宾毒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澜搅,我是刑警寧澤伍俘,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布邪锌,位于F島的核電站勉躺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏觅丰。R本人自食惡果不足惜饵溅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妇萄。 院中可真熱鬧蜕企,春花似錦咬荷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唇牧,卻和暖如春罕扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丐重。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工腔召, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮惦。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓臀蛛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親崖蜜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浊仆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容