ios jenkins配置_Jenkins + TestNG 实现自助式自动化测试平台
摘要:
本文介紹了如何使用 Jenkins 和 TestNG 實(shí)現(xiàn)滿足復(fù)雜測(cè)試需求的”自助式”自動(dòng)化測(cè)試平臺(tái)。該方案以 Jenkins 作為平臺(tái)的基礎(chǔ),結(jié)合功能強(qiáng)大的插件及系統(tǒng)配置,部署基于 TestNG 的自動(dòng)化測(cè)試包,并提供了友好的 Web 訪問(wèn)界面。項(xiàng)目成員可以在任何時(shí)間和地點(diǎn),通過(guò)瀏覽器訪問(wèn)該平臺(tái),而且可以按照不同需求選擇測(cè)試環(huán)境、測(cè)試集、測(cè)試用例,并提交自動(dòng)化測(cè)試請(qǐng)求,達(dá)到真正的“自助式”自動(dòng)化測(cè)試。該平臺(tái)它可以極大地提高開發(fā)和測(cè)試團(tuán)隊(duì)自動(dòng)化腳本的使用效率和便捷性。
目錄:
1、提出需求
2、方案設(shè)計(jì)
3、編碼
4、測(cè)試
正文:
一. 提出需求
測(cè)試部開發(fā)一套自己的質(zhì)量中心,主要用于缺陷統(tǒng)計(jì)、接口自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、在線監(jiān)控等,在接口自動(dòng)化測(cè)試和APP自動(dòng)化測(cè)試過(guò)程中,我們需要實(shí)現(xiàn),用戶選擇不同的測(cè)試集合,集合中包含哪些測(cè)試用例,TestNG會(huì)自己去執(zhí)行不同的測(cè)試用例,做到根據(jù)用戶不同的輸入做出不同的響應(yīng)。
二. 方案設(shè)計(jì)
1、質(zhì)量中心(WEB)提供測(cè)試用例管理和測(cè)試集合管理,創(chuàng)建測(cè)試任務(wù),關(guān)聯(lián)測(cè)試集合,測(cè)試集合又關(guān)聯(lián)測(cè)試用例
2、質(zhì)量中心(WEB)將創(chuàng)建的測(cè)試任務(wù)相應(yīng)的調(diào)用Jenkins任務(wù),并把相應(yīng)的需要傳遞的參數(shù)傳遞過(guò)去
3、Jenkins任務(wù)啟動(dòng),先根據(jù)傳進(jìn)來(lái)的測(cè)試任務(wù)編號(hào),找到相應(yīng)的測(cè)試集合和測(cè)試用例,并用Python腳本生成相應(yīng)的TestNG XML文件,其中XML文件定義了需要執(zhí)行的測(cè)試用例,這樣子就做到了,根據(jù)用戶不同的輸入做出不同的相應(yīng)
4、Jenkins執(zhí)行Python生成的TestNG XML文檔
5、TestNG在Jenkins上執(zhí)行后會(huì)在surefine-reports文件夾下面生成emailable-report.html測(cè)試報(bào)告
6、Jenkins任務(wù)執(zhí)行完再次調(diào)用Python腳本,將生成的emailable-report.html報(bào)告寫入MySQL存儲(chǔ)起來(lái),提供給質(zhì)量中心(WEB)查看
本文純干貨,自備酒水,免得把自己[噎住] ( *⊙~⊙)
加入我們,,領(lǐng)取最新軟件測(cè)試大廠面試資料和Python自動(dòng)化、接口、框架搭建學(xué)習(xí)資料!技術(shù)大牛解惑答疑,同行一起交流
三. 編碼
3.1 質(zhì)量中心->APP自動(dòng)化測(cè)試 數(shù)據(jù)庫(kù)設(shè)計(jì)
app_elements:存儲(chǔ)app頁(yè)面控件,如Android的resource id,iOS的xpath
app_execute: 存儲(chǔ)支持執(zhí)行結(jié)果,測(cè)試報(bào)告、測(cè)試結(jié)果等
app_mobile: 存儲(chǔ)測(cè)試機(jī)型的相關(guān)信息
app_modules: 存儲(chǔ)測(cè)試APP中包含的模塊,分層的思想,方便管理
app_platform: 存儲(chǔ)測(cè)試APP,支持多個(gè)APP
app_suitecase: 存儲(chǔ)測(cè)試集合與測(cè)試用例的關(guān)系,一個(gè)測(cè)試用例對(duì)應(yīng)多個(gè)測(cè)試集合
app_testcase:存儲(chǔ)測(cè)試用例
app_testjob:存儲(chǔ)測(cè)試任務(wù),關(guān)聯(lián)相應(yīng)的Jenkins路徑,直接多地執(zhí)行
app_testsuite:存儲(chǔ)測(cè)試集合
3.2 Jenkins參數(shù)配置
TestPlatform: 測(cè)試平臺(tái),是Android還是iOS
TestDevice: 測(cè)試設(shè)備,Android需要傳入udid,iOS不需要
TestEnv: 測(cè)試環(huán)境,qa還是live
TestJobId: 測(cè)試任務(wù)編號(hào),通過(guò)這個(gè)任務(wù)編號(hào)可以MySQL查詢到關(guān)聯(lián)的測(cè)試集合以及測(cè)試集合中的測(cè)試用例
TestExecuteId: 執(zhí)行任務(wù)編號(hào),傳入Python腳本,講生成的測(cè)試報(bào)告emailable-report.html存放相應(yīng)的位置
3.3 Python文件生成TestNG XML
# -*- coding:utf-8 -*- import os import MySQLdb import sys import xml.dom.minidom# 外部傳入的測(cè)試任務(wù)編號(hào) test_job_id = sys.argv[1]# 連接db def connect_db(db):db = MySQLdb.connect(host="10.9.8.20",port=3306,user="***",passwd="***",db=db,charset="utf8")return db# 請(qǐng)求mysql獲取數(shù)據(jù) def get_data(db, sql):conn = connect_db(db)cur = conn.cursor()cur.execute(sql)data = cur.fetchall()cur.close()conn.commit()conn.close()return data# 判斷文件是否存在,如果不存在立即創(chuàng)建,如果存在,則立即刪除,重新覆蓋 def xml_exist():file_name = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/resources/YouYu_Stock.xml"if os.path.exists(file_name):os.remove(file_name)f = open(file_name, "w")f.close()return file_name# 獲取測(cè)試用例英文名 def get_case_name():suite_id = get_data("app", "select suite_id from app_testjob where id=" + test_job_id)[0][0]case_id = get_data("app", "select case_id from app_suitecase where suite_id=" + str(suite_id))list_case_name = []for i in xrange(0, len(case_id)):case_name = get_data("app", "select ename from app_testcase where id=" + str(case_id[i][0]))[0][0]list_case_name.append(case_name)return list_case_namedef main():file_name = xml_exist()case_names = get_case_name()doc = xml.dom.minidom.Document()root = doc.createElement("suite")root.setAttribute("name", "TestSuite")root.setAttribute("parallel", "false")doc.appendChild(root)# 添加parameternodeManager = doc.createElement("parameter")nodeManager.setAttribute("name", "url")nodeManager.setAttribute("value", "127.0.0.1")root.appendChild(nodeManager)nodeManager = doc.createElement("parameter")nodeManager.setAttribute("name", "port")nodeManager.setAttribute("value", "4727")root.appendChild(nodeManager)nodeManager = doc.createElement("parameter")nodeManager.setAttribute("name", "device")nodeManager.setAttribute("value", "${TestPlatform}")root.appendChild(nodeManager)nodeManager = doc.createElement("parameter")nodeManager.setAttribute("name", "udid")nodeManager.setAttribute("value", "${TestDevice}")root.appendChild(nodeManager)nodeManager = doc.createElement("parameter")nodeManager.setAttribute("name", "env")nodeManager.setAttribute("value", "${TestEnv}")root.appendChild(nodeManager)# 添加test casefor i in xrange(0, len(case_names)):print case_names[i]node_test = doc.createElement("test")node_test.setAttribute("name", case_names[i])node_classes = doc.createElement("classes")node_test.appendChild(node_classes)node_class = doc.createElement("class")node_class.setAttribute("name", "com.youyu.stock.automation.mobile.testcase.registerAndLogin.RegisterAndLoginTestCase")node_classes.appendChild(node_class)node_methods = doc.createElement("methods")node_class.appendChild(node_methods)node_include = doc.createElement("include")node_include.setAttribute("name", case_names[i])node_methods.appendChild(node_include)root.appendChild(node_test)f = file(file_name, "w")doc.writexml(f, "t", "t", "n", "utf-8")f.close()if __name__ == '__main__':3.4 Jenkins配置與執(zhí)行Maven TestNG
Maven pom.xml定義:
<build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19.1</version><configuration><systemPropertyVariables><testEnvironment>${TestDevice}</testEnvironment><testEnvironment>${TestEnv}</testEnvironment><testEnvironment>${TestJobId}</testEnvironment></systemPropertyVariables><suiteXmlFiles><suiteXmlFile>${automationFile}</suiteXmlFile></suiteXmlFiles></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></pluginManagement></build>3.5 生成的TestNG XML文件,例如:
3.6 生成的emailable-report.html存儲(chǔ)在MySQL中
# -*- coding:utf-8 -*- import os import sys import MySQLdb from bs4 import BeautifulSoup# 外部傳入執(zhí)行任務(wù)時(shí)參數(shù)的編號(hào) execute_id = sys.argv[1]# 連接db def connect_db(db):db = MySQLdb.connect(host="10.9.8.20",port=3306,user="***",passwd="***",db=db,charset="utf8")return db# 請(qǐng)求mysql獲取數(shù)據(jù) def get_data(db, sql):conn = connect_db(db)cur = conn.cursor()cur.execute(sql)data = cur.fetchall()cur.close()conn.commit()conn.close()return datadef write_result():file_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/target/surefire-reports/emailable-report.html"f = open(file_path, "r")html = f.read()# 測(cè)試結(jié)果寫入MySQLsoup = BeautifulSoup(html)PassCase = int(soup.find_all("th", class_="num")[0].get_text())FailCase = int(soup.find_all("th", class_="num")[2].get_text())# 測(cè)試報(bào)告寫入MySQLhtml = MySQLdb.escape_string(html)get_data("app", "update app_execute set test_result="%s", test_report="%s" where id=%s" % (str(PassCase) + "/" + str(PassCase+FailCase), html, str(execute_id)))if __name__ == '__main__':write_result()四. 測(cè)試
4.1 質(zhì)量平臺(tái)
總結(jié):
為了實(shí)習(xí)根據(jù)用戶不同的輸入做出不同的相應(yīng),期間嘗試方案如下:
1、TestNG @Test enabled=false或者true 失敗,失敗原因:enabled傳入值必須是定值
2、TestNG 自動(dòng)-testname可以根據(jù)傳入不同的test name選擇執(zhí)行不同的測(cè)試用例,失敗,依賴包太多,Maven項(xiàng)目下載的包不能通過(guò)classpath方式安裝到本地classpath,maven進(jìn)行了一層封裝,maven的dependences
3、Maven 執(zhí)行命令行mvn clean test將TestNG參數(shù)傳遞進(jìn)去,失敗,失敗原因:Maven -Dtest僅僅選擇需要執(zhí)行的,并不能知道TestNG中的參數(shù)
總結(jié)
以上是生活随笔為你收集整理的ios jenkins配置_Jenkins + TestNG 实现自助式自动化测试平台的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北京数码视讯s905l固件_神州数码与M
- 下一篇: 战争有多少种类型?