日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ios jenkins配置_Jenkins + TestNG 实现自助式自动化测试平台

發(fā)布時(shí)間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios jenkins配置_Jenkins + TestNG 实现自助式自动化测试平台 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:

本文介紹了如何使用 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产综合网站 | 午夜av免费看 | 一呦二呦三呦精品网站 | 亚洲精品无码一区二区 | 久久综合五月 | 国产成人在线电影 | 日韩三级国产精品 | 在线观看欧美视频 | 婷婷人体 | 亚洲小说春色综合另类 | 久久久无码精品亚洲国产 | 爱情岛论坛亚洲自拍 | 高清欧美精品xxxxx在线看 | 亚洲人久久 | 美女写真福利视频 | 最新国产精品视频 | 又黄又高潮的视频 | 色悠悠国产 | 精品人伦一区二区三区蜜桃网站 | 国产精品18久久久久久vr下载 | 超碰av男人的天堂 | chinese麻豆新拍video | 亚洲a一区| 777久久久精品一区二区三区 | 玖玖在线视频 | 欧美第一页在线观看 | 狠狠干女人| 日韩三级成人 | 久久艹这里只有精品 | 久久性感视频 | 国产黄视频网站 | 少妇av导航 | 久久久久夜 | 91香蕉国产 | 操欧美老逼 | 99国产精品视频免费观看一公开 | 五月婷婷六月丁香综合 | asian性开放少妇pics | 欧美成人片在线 | 在线观看99| 久久人人人 | 青青视频网 | www.蜜桃av| av新天堂| 亚洲乱论| 亚洲国产成人精品久久久 | 在线免费观看黄网站 | 国产伦精品一区二区三区免费 | 91精品国产欧美一区二区 | 亚洲综合av网 | 九九热精品视频在线播放 | 色婷婷亚洲 | 日本国产一区 | 特黄一级毛片 | 亚洲一区二区日韩 | 美女免费看片 | 中文文字幕一区二区三三 | 男人靠女人免费视频网站 | 99爱精品视频 | 色婷婷麻豆 | 一级黄色短视频 | 一本色道久久综合精品婷婷 | 国产任你操 | 91黄色在线视频 | 色欧美视频 | 熟妇女人妻丰满少妇中文字幕 | www欧美com| 国产精品二区一区 | 国产日产欧美 | 成人a级大片 | 小色哥网站 | 亚洲成a人v欧美综合天堂麻豆 | 黄色av导航 | 男人操女人的网站 | 男女又爽又黄 | 卡通动漫精品一区二区三区 | 日韩操 | 国产成人自拍偷拍 | 永久视频| 国产极品美女高潮无套嗷嗷叫酒店 | 女同性做爰全过程 | 色哟哟一区二区 | 天堂网www在线 | 国产鲁鲁视频在线观看特色 | 三浦惠理子aⅴ一二三区 | 色很久| 手机av免费在线 | 黄色小网站入口 | 九草影院| 少妇人妻真实偷人精品视频 | 国产精品久久久久久亚洲调教 | av一级二级 | 久操网站 | 99色在线观看 | 任我爽在线 | 国产孕妇孕交大片孕 | 国产一区在线视频观看 | 一区二区三区四区欧美 | 欧美一级大片在线观看 |