1. 程式人生 > 實用技巧 >基於python的自動化測試指令碼:web端以及介面、APP測試

基於python的自動化測試指令碼:web端以及介面、APP測試

一、專案:針對百度首頁搜尋功能的測試: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 unittest
from 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()