移動端自動化測試框架搭建


搭建框架的幾點思考:

  • 需要框架實現什么功能
  • 前期需要做數據與業務分離,方便維護
  • 測試用例集管理要方便,便於異常時重新Run單條用例
  • 用例設計需要盡可能簡單,多提供公共方法

 

 

  1. 目前設計框架如下圖:

  

  • CommonLibrary 用於存放公共庫
  • TestCasesRepository 用於存放測試用例
  • TestData 用於存放與測試用例有關的測試數據文檔
  • TestRun_xxx 是測試過程中生成的測試結果,內含測試報告和日志
  • AutoRunTest.py 用於從用例列表中讀取需要執行的測試用例文件,及測試結束后測試報告的發送
  • testcases.txt 用於存放用例表

  2. 其中公共庫中大致有Appium的操作、Excel檔的操作、手機信息的配置、測試用例信息的收集、測試結果文件夾的生產 、測試報告的寫入、郵件發送等公共方法

目錄如下:

 

如Appiumserver大致如下設計:

#! /usr/bin/env python
#coding=utf-8
import os,time

def start_appiumServer(port11,port12,deviceuuid):
 
    os.system("cd C:\\Program Files (x86)\\Appium\\  && start node node_modules\\appium\\lib\\server\\main.js --address 127.0.0.1 --port "+port11+ " -bp "+port12+" -U "+deviceuuid)
    time.sleep(2)

def kill_appiumServer(port13):
    # 查找對應端口的pid
    cmd_find = 'netstat -aon | findstr %s' % port13
    print(cmd_find)

    result = os.popen(cmd_find)
    text = result.read()
    pid = text[-5:-1]

    # 執行被占用端口的pid
    cmd_kill = 'taskkill -f -pid %s' % pid
    print(cmd_kill)
    os.popen(cmd_kill)

if __name__ == '__main__':
    #start_appiumServer('4729','4728','BIBI5LEU6PRCDIIV')
    #start_appiumServer('4727','4724','75a2daf1')
    #time.sleep(10)
    kill_appiumServer(4729)
    kill_appiumServer(4727)

 

EmailUtils結構如下:

#! /usr/bin/env python
#coding=utf-8

import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE,formatdate
from datetime import datetime
import ResultFolder
from email.header import Header
import zipfile,os
import decode_pwd



def send_email(send_from,send_to,subject,text,files1,files2,server="smtp.163.com"):

    #assert(isinstance(send_to,list),"Send To email should be a list")

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = send_to
    msg['Date'] = formatdate(localtime = True)
    msg['Subject'] = Header(subject, 'utf-8')
    my_password = "7A68656E676A696E6731313238"
    my_pass = decode_pwd.decode_pwd(my_password)

    msg.attach(MIMEText(text,'html'))

    with open(files1,"rb") as f:
        part1 = MIMEApplication(f.read())
        part1["Content-Type"] = 'application/octet-stream'
        part1["Content-Disposition"] = 'attachment; filename="TestResult.html"'
        msg.attach(part1)
		
    with open(files2,"rb") as g:
        part2 = MIMEApplication(g.read())
        part2["Content-Type"] = 'application/octet-stream'
        part2["Content-Disposition"] = 'attachment; filename="Test.log"'
        msg.attach(part2)
    smtp = smtplib.SMTP_SSL(server,465)
    smtp.login(send_from,my_pass)
    smtp.sendmail(send_from,send_to,msg.as_string())
    smtp.quit()

def zip_report(startdir,file_news):
    print startdir
    z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED)
    for dirpath, dirnames, filenames in os.walk(startdir):
        fpath = dirpath.replace(startdir, '')  # 這一句很重要,不replace的話,就從根目錄開始復制
        fpath = fpath and fpath + os.sep or ''  # 這句話理解我也點郁悶,實現當前文件夾以及包含的所有文件的壓縮
        for filename in filenames:
            z.write(os.path.join(dirpath, filename), fpath + filename)
    print ('壓縮成功')
    z.close()


def send_report():
    send_f = "xxxxx@163.com"
    send_t = "xxxxxx@163.com"
    subject = "Software test Report_"+ str(datetime.today())

    files1 = ResultFolder.GetRunDirectory()+"\\TestResult.html"

    print "zip log is start"
    zipdir = ResultFolder.GetRunDirectory()+"\\"
    file2_news = zipdir + 'TestLog.zip'
    zip_report(zipdir,file2_news)
    files2 = ResultFolder.GetRunDirectory() + "\\TestLog.zip"


    with open(files1,'r') as f:
        text = f.read()

    send_email(send_f,send_t,subject,text,files1,files2)

if __name__=='__main__':
    send_report()

  

其他模塊就不一一列舉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM