基於python的自動化測試指令碼:web端以及介面、APP測試
阿新 • • 發佈:2020-10-27
一、專案:針對百度首頁搜尋功能的測試:python+selenium+unittest
1、page object封裝頁面元素。
from poium import Page, NewPageElement class BaiduPage(Page): """封裝百度Page層""" search_input = NewPageElement(id_="kw",describe="搜尋框") search_button = NewPageElement(id_="su",describe="搜尋按鈕") setting = NewPageElement(id_="s-usersetting-top",describe="設定按鈕") search_setting = NewPageElement(link_text="搜尋設定") high_level_setting = NewPageElement(link_text="高階設定") save_setting = NewPageElement(link_text="儲存設定") language_setting = NewPageElement(id_ = "SL_1",describe="簡體中文")
2、封裝谷歌瀏覽器啟動操作
import unittestfrom selenium import webdriver class Launch_Brower(unittest.TestCase): """開啟/關閉 谷歌瀏覽器""" @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.baidu_url = "https://www.baidu.com/" @classmethod def tearDownClass(cls): cls.driver.quit() if __name__=="__main__": unittest.main()
3、test case:用parameterized.expand()或ddt.file_data實現引數化。
import unittest,csv,codecs, os, sys base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, base_path) from common.launch_brower import Launch_Brower from page.baidu_page import BaiduPage from time import sleep from parameterized import parameterized from itertools import islice from ddt import ddt,file_data,unpack @ddt class TestSearchKeyword(Launch_Brower): def search_keyword(self,keyword): page = BaiduPage(self.driver) page.get(self.baidu_url) page.search_input.send_keys(keyword) page.search_button.click() sleep(2) def get_data(file_path): """讀取引數化檔案baidu_data.csv""" data = [] with codecs.open(file_path , "r") as f: temp = csv.reader(f) for i in islice(temp,1,None): data.append(tuple(i)) return data @parameterized.expand( get_data(base_path + "/test_case/baidu_data/data_file.csv")) def test_01_search_keyword(self,name,keyword): self.search_keyword(keyword) title = self.driver.title self.assertEqual(title, keyword + "_百度搜索") @file_data("ddt.json") @unpack def test_02_search_keyword(self,keyword): self.search_keyword(keyword) title = self.driver.title self.assertEqual(title, keyword + "_百度搜索") if __name__=="__main__": unittest.main(verbosity=2)
4、呼叫HTMLTestRunner執行測試用例生成報告。
import time,unittest from HTMLTestRunner import HTMLTestRunner import time,sys sys.path.append("./test_case") if __name__=="__main__": test_dir = './test_case' suit = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') now_time = time.strftime("%Y-%m-%d %H_%M_%S") filename = './report/'+now_time+'_result.html' with open(filename, "wb") as fp: runner = HTMLTestRunner(stream=fp, title='百度', description="win 10", verbosity=2) runner.run(suit,rerun=0,save_last_run=False) fp.close()
二、針對Django專案的介面測試:python+requests+unittest
1、封裝資料庫的連線和操作:
from pymysql import connect, cursors from pymysql.err import OperationalError class DB: def __init__(self): try: self.connection = connect(host='127.0.0.1', port=int(3306), db = 'guest', user = 'root', password = '123456', charset = 'utf8', cursorclass=cursors.DictCursor) except OperationalError as e: print("Mysql Error %d: %s" % (e.args[0], e.args[1])) self.cur = self.connection.cursor() def insert(self, table_name, data): for key in data: data[key] = "'"+str(data[key])+"'" key = ','.join(data.keys()) value = ','.join(data.values()) sql = "INSERT INTO " + table_name + " (" + key + ") VALUES\ (" + value + ")" self.cur.execute(sql) self.connection.commit() def clear(self,table_name): sql = "delete from " + table_name + ";" self.cur.execute("SET FOREIGN_KEY_CHECKS=0;") self.cur.execute(sql) self.connection.commit() def close(self): self.connection.close() #初始化資料:將測試資料插入表 def init_data(self,datas): for table_name,data in datas.items(): self.clear(table_name) for d in data: self.insert(table_name,d) self.close() if __name__=="__main__": db = DB() db.close()
二、構造測試資料:
import sys, time sys.path.append('./db_fixture') from mysql_db import DB # 定義時間 time = time.strftime("%Y-%m-%d %H:%M:%S") # 構造資料 datas = { 'sign_event':[ {'id':1,'name':'redmi','`limit`':2000,'status':1,'address':'beijing','start_time': time}, ], 'sign_guest':[ {'id':1,'realname':'alen','phone':13511001100,'email':'[email protected]','sign':0,'event_id':1}, {'id':2,'realname':'jerry','phone':13511001101,'email':'[email protected]','sign':1,'event_id':1}, {'id':3,'realname':'tom','phone':13511001102,'email':'[email protected]','sign':0,'event_id':1}, ], } # 初始化資料 def init_data(): DB().init_data(datas) if __name__ == '__main__': init_data()
3、test case
import unittest import requests class GetEventListTest(unittest.TestCase): """查詢釋出會資訊:帶使用者驗證""" def setUp(self): self.url = "http://127.0.0.1:8000/api/sec_get_event_list/" def tearDown(self): print(self.result) def test_01_get_event_list_success(self): """query is success""" user_auth = ("admin", "admin123") r = requests.get(self.url, auth = user_auth, params={"eid":2}) self.result = r.json() self.assertEqual(self.result["status"],200) self.assertEqual(self.result["message"],"success") self.assertEqual(self.result["data"]["address"], 'beijing') self.assertEqual(self.result["data"]["name"], "iphone") if __name__=="__main__": unittest.main(verbosity=2)
import unittest,requests,hashlib import time class AddEventTest(unittest.TestCase): def setUp(self): self.url = "http://127.0.0.1:8000/api/sec_add_event/" """ 參考介面開發程式碼生成md5()加密物件的方式來 生成測試指令碼的md5()引數. md5(api_key + time) """ #介面簽名程式碼中獲取api_key self.api_key = "&Guest-Bugmaster" #當前時間 now_time =time.time() self.client_time=str(now_time).split('.')[0] #介面簽名程式碼中獲取加密物件生成方式 md5 = hashlib.md5() sign_str = self.client_time+self.api_key sign_bytes_utf8=sign_str.encode(encoding='utf-8') md5.update(sign_bytes_utf8) self.sign_md5 = md5.hexdigest() def tearDown(self): print(self.result) def test_01_add_event_success(self): """新增成功""" payload={"eid":3,"name":"HUAWEI","limit":2000,"address":"shanghai", "start_time":"2014-05-03 12:20:32","time":self.client_time, "sign":self.sign_md5} r = requests.post(self.url,data=payload) self.result=r.json() self.assertEqual(self.result["status"],200) self.assertEqual(self.result["message"],"add event success") if __name__=="__main__": unittest.main(verbosity=2)
4、執行測試用例:
import time, sys,unittest sys.path.append('./interface') sys.path.append('./db_fixture') from db_fixture import test_data from HTMLTestRunner import HTMLTestRunner test_dir = './interface' suit = unittest.defaultTestLoader.discover(test_dir, pattern='*_test.py') if __name__ == "__main__": test_data.init_data() # 初始化介面測試資料 now = time.strftime("%Y-%m-%d %H_%M_%S") filename = './report/' + now + '_result.html' fp = open(filename, 'wb') runner = HTMLTestRunner(stream=fp, title='介面自動化測試', description='執行環境:MySQL(PyMySQL), \ Requests, unittest ', verbosity=2) runner.run(suit,rerun=0,save_last_run=False) fp.close()
三、啟動有道APP。
import unittest,time from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC caps = {} caps["deviceName"] = "HWJSN-HW" caps["automationName"] = "appium" caps["platformVersion"] = "10" caps["platformName"] = "Android" caps["appPackage"] = "com.youdao.dict" caps["appActivity"] = ".activity.MainActivity" caps["ensureWebviewsHavePages"] = True class Launch_youdao(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) cls.driver.implicitly_wait(10) try: loc = ("xpath", "//*[@text='始終允許']") el = WebDriverWait(cls.driver, 5, 0.5).until(EC.presence_of_element_located(loc)) TouchAction(cls.driver).tap(el).perform() except: pass @classmethod def tearDownClass(cls): cls.driver.quit() if __name__=="__main__": unittest.main()