1、實現數據與代碼分離,維護成本較低,先看看自動化結構,大致以下:css
testyaml管理用例,實現數據與代碼分離,一個模塊一個文件夾html
public 存放公共文件,如讀取配置文件、啓動appium服務、讀取Yaml文件、定義日誌格式等node
page 存放最小測試用例集,一個模塊一個文件夾android
results 存放測試報告及失敗截圖ios
運行的結果:web
3、yaml格式介紹shell
element_info:定位元素信息bootstrap
find_type:屬性,id、xpath、text、idsxcode
operate_type: click、wait_activity、send_keys、back、swipe_up、sleep、clickbox(有彈框就關閉,沒有就跳過),check(常常預期結果),暫時就八種多線程
上面三個必填,operate_type必填!!!!!!
send_content:send_keys 時用到
index:ids時用到 (定位是複式的時候能夠索引)
times: 返回次數或者上滑次數
我的以爲核心的就是公共部分,至關於建房子,公共部分搞好了,後面僅僅是調用便可,建房子把架子搭好,後面就添磚加瓦吧。
讀取配置文件readconfig.py
設置日誌格式logs.py
獲取設備GetDevices.py
這幾個通用的就不作介紹了
#coding=utf-8 #author='Shichao-Dong' import sys reload(sys) sys.setdefaultencoding('utf8') #設置編碼格式 import yaml import codecs import random from random import choice def rand( total, num): '''生成不重複的隨機數,total總數,num生成的個數''' li = [i for i in range(total)] res = [] for i in range(num): t = random.randint(i, total - 1) res.append(li[t]) li[t], li[i] = li[i], li[t] return res def random_phonenumber(): # 生成隨機手機號碼 area_num = 399999 # area_number = choice(area_num) seed = "1234567890" sa = [] for i in range(6): sa.append(choice(seed)) last_eightnumber = ''.join(sa) phone = str(area_num) + last_eightnumber return phone class getyaml: def __init__(self,path): self.path = path def getYaml(self): ''' 讀取yaml文件 :param path: 文件路徑 :return: ''' try: f = open(self.path) data =yaml.load(f) f.close() return data except Exception: print(u"未找到yaml文件") def alldata(self): ''' 獲取yaml裏面全部的數據 :return: ''' data =self.getYaml() return data def caselen(self): ''' 獲取元素定位的個數 :return: ''' data = self.alldata() length = len(data['testcase']) return length def get_elementinfo(self,i): ''' 獲取yaml裏面的element_info i:想要獲取的索引 :param i: :return: ''' data = self.alldata() # print data['testcase'][i]['element_info'] return data['testcase'][i]['element_info'] def get_findtype(self,i): ''' 獲取yaml裏面的find_type i:想要獲取的索引 :param i: :return: ''' data = self.alldata() # print data['testcase'][i]['find_type'] return data['testcase'][i]['find_type'] def get_operate_type(self,i): ''' 獲取yaml裏面的operate_type i:想要獲取的索引 :param i: :return: ''' data = self.alldata() # print data['testcase'][i]['operate_type'] return data['testcase'][i]['operate_type'] def get_index(self, i): ''' 獲取yaml裏面的operate_type i:想要獲取的索引 :param i: :return: ''' data = self.alldata() if self.get_findtype(i) == 'ids': text_yaml = data['testcase'][i]['index'] if str(text_yaml) == 'listtext': list_text = rand(10,5) return list_text elif str(text_yaml) == 'random': list_text = random.randint(1, 10) return list_text else: return text_yaml if self.get_findtype(i) == 'class_name': text_yaml = data['testcase'][i]['index'] if str(text_yaml) == 'listtext': list_text = rand(10, 5) return list_text elif str(text_yaml) == 'random': list_text = random.randint(1, 10) return list_text else: return text_yaml else: pass def get_send_content(self,i): ''' 獲取yaml裏面的send_content i:想要獲取的索引 :param i: :return: ''' data = self.alldata() # print data['testcase'][i]['send_content'] if self.get_operate_type(i) == 'send_keys': text_yaml = data['testcase'][i]['send_content'] if str(text_yaml) == 'phone_number': text = random_phonenumber() return str(text) elif str(text_yaml) == 'random': text = random.randint(1, 10) return text else: # text = text_yaml.decode('utf-8') return str(text_yaml) else: pass def get_sleeptime(self, i): ''' 獲取yaml裏面的operate_type i:想要獲取的索引 :param i: :return: ''' data = self.alldata() # print data['testcase'][i]['operate_type'] return data['testcase'][i]['sleeptime'] def get_backtimes(self, i): data = self.alldata() if self.get_operate_type(i)=='back' or self.get_operate_type(i)=='swipe_up': return data['testcase'][i]['times'] elif self.get_operate_type(i)=='swipe_down': return data['testcase'][i]['times'] elif self.get_operate_type(i)=='swipe_left': return data['testcase'][i]['times'] elif self.get_operate_type(i) == 'swipe_right': return data['testcase'][i]['times'] else: pass def get_title(self): data = self.alldata() # print data['testinfo'][0]['title'] return data['testinfo'][0]['title']
#coding=utf-8 #author='Shichao-Dong' from logs import log import random,time import platform import os from GetDevices import devices log = log() dev = devices().get_deviceName() class Sp: def __init__(self, device): self.device = device def __start_driver(self, aport, bpport): """ 3. 多設備執行 1. 安卓下多設備執行意味着每個設備須要對應一個appium服務端,而且腳本部分須要實現多線程訪問,appium服務端啓動命令以下: appium -p 4490 -bp 3456 -U xxxx -p 表示服務端和腳本通訊的端口 -bp 表示服務端和設備的AppiumBootStrap.jar進行通訊的端口 -U 表示當前服務是針對哪一臺設備的 2. ios在xcode8如下不支持多設備執行緣由是instruments不支持多實例 """ if platform.system() == 'Windows': #獲取操做系統名稱 import subprocess subprocess.Popen("appium -p %s -bp %s -U %s" %(aport, bpport, self.device), shell=True) def start_appium(self): """ 啓動appium p:appium port bp:bootstrap port :return: 返回appium端口參數 """ aport = random.randint(4700, 4900) bpport = random.randint(4700, 4900) self.__start_driver(aport, bpport) log.info( 'start appium :p %s bp %s device:%s' %(aport, bpport, self.device)) time.sleep(10) return aport def main(self): """ :return: 啓動appium """ return self.start_appium() def stop_appium(self): ''' 中止appium :return: ''' if platform.system() == 'Windows': os.popen("taskkill /f /im node.exe") if __name__ == '__main__': s = Sp(dev) s.main()
#coding=utf-8 #author='Shichao-Dong' import time from appium import webdriver from selenium.common.exceptions import WebDriverException import readConfig import GetDevices from StartAppiumServer import Sp from logs import log import os log = log() conf = readConfig.Readconfig() platformName =conf.getConfigValue('platformName').encode('ascii') apppackage = conf.getConfigValue('appPackage').encode('ascii') appactivity = conf.getConfigValue('appactivity').encode('ascii') platformversion =conf.getConfigValue('platformversion').encode('ascii') devicename = conf.getConfigValue('devicename').encode('ascii') # s = Sp(devicename) # appium_port = s.main() #啓動appium def mydriver1(): os.system('call adb shell input keyevent 82') desired_caps = { 'platformName':platformName, 'deviceName':devicename, 'platformVersion':platformversion, 'appPackage':apppackage, 'appActivity':appactivity, 'unicodeKeyboard':True, 'resetKeyboard':True, # 'noReset':True, 'newCommandTimeout':180 } try: driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub'%appium_port,desired_caps) time.sleep(4) log.info('獲取driver成功') return driver except WebDriverException: print 'No driver' def mydriver2(): os.system('call adb shell input keyevent 82') desired_caps = { 'platformName':platformName, 'deviceName':devicename, 'platformVersion':platformversion, 'appPackage':apppackage, 'appActivity':appactivity, 'unicodeKeyboard':True, 'resetKeyboard':True, 'noReset':True, 'newCommandTimeout':180 } try: driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub'%appium_port,desired_caps) time.sleep(4) log.info('獲取driver成功') return driver except WebDriverException: print 'No driver'
#coding=utf-8 #author='Shichao-Dong' from selenium.webdriver.support.ui import WebDriverWait from appium.webdriver.webelement import WebElement from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By from logs import log import os import time import random from random import choice from appium.webdriver.mobilecommand import MobileCommand ''' 一些基礎操做:滑動、截圖、點擊頁面元素等 ''' log = log() # driver = GetDriver.mydriver() class BaseOperate: def __init__(self,driver): self.driver = driver def back(self): ''' 返回鍵 :return: ''' os.popen("adb shell input keyevent 4") def get_window_size(self): ''' :return:返回屏幕的大小 ''' x=self.driver.get_window_size()['width'] y=self.driver.get_window_size()['height'] return(x,y) def swipe_up(self): ''' :return:向上滑動 ''' try: l=self.get_window_size() x1=int(l[0]*0.5) y1=int(l[0]*0.9) y2=int(l[1]*0.2) self.driver.swipe(x1,y1,x1,y2,1000) except: log.error(u"上滑動異常") def swipe_down(self): ''' :return:向下滑動 ''' try: l=self.get_window_size() x1=int(l[0]*0.5) y1=int(l[0]*0.2) y2=int(l[1]*0.8) self.driver.swipe(x1,y1,x1,y2,1000) except: log.error(u"下滑動異常") def swipe_right(self): ''' :return:向右滑動 ''' try: l=self.get_window_size() x1=int(l[0]*0.2) x2=int(l[0]*0.8) y1=int(l[1]*0.5) self.driver.swipe(x1,y1,x2,y1,1000) except: log.error(u"右滑動異常") def swipe_left(self): ''' :return:向左滑動 ''' try: l=self.get_window_size() x1=int(l[0]*0.8) x2=int(l[0]*0.2) y1=int(l[1]*0.5) self.driver.swipe(x1,y1,x2,y1,1000) except: log.error(u"左滑動異常") def screenshot(self): now=time.strftime("%y%m%d-%H-%M-%S") PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) screenshoot_path = PATH('../results/screenshoot/failpic') self.driver.get_screenshot_as_file(screenshoot_path+now+'.png') def find_id(self,id): ''' 尋找元素 :return: ''' # 判斷元素是否顯示 try: self.driver.find_element_by_id(id).is_enabled() return True except : # self.screenshot() return False def find_name(self,name): ''' 判斷頁面是否存在某個元素 :param name: text :return: ''' findname = "//*[@text='%s']"%(name) try: self.driver.find_element_by_xpath(findname).is_enabled() return True except : # self.screenshot() return False def get_name(self,name): ''' 定位頁面text元素 :param name: :return: ''' findname = "//*[@text='%s']"%(name) try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(findname)) WebDriverWait(self.driver, 15).until(lambda driver: driver.find_element_by_xpath(findname).is_displayed()) element = self.driver.find_element_by_xpath(findname) return element except: # self.screenshot() log.error('未定位到元素:'+'%s'%(name)) def getname_text(self,name): ''' 定位頁面text元素 :param name: :return: ''' findname = "//*[@text='%s']"%(name) try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(findname)) WebDriverWait(self.driver, 15).until(lambda driver: driver.find_element_by_xpath(findname).is_displayed()) element_text = self.driver.find_element_by_xpath(findname).text return element_text except: # self.screenshot() log.error('未定位到元素:'+'%s'%(name)) def getid_text(self,id): ''' 定位頁面resouce-id元素文本 :param id: :return: ''' try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(xpath)) WebDriverWait(self.driver, 20).until(lambda driver: driver.find_element_by_id(id).is_displayed()) element_text = self.driver.find_element_by_id(id).text return element_text except: # self.screenshot() # self.driver.get_screenshot_as_file("D:/error.png") log.error('未定位到元素:'+'%s'%(id)) def getids_text(self,id): ''' 定位頁面resouce-id元素組 :param id: :return:列表 ''' try: elements = WebDriverWait(self.driver, 20).until(lambda x: x.find_elements_by_id(id)) self.driver.implicitly_wait(2) return elements except: # self.screenshot() log.error('未定位到元素:'+'%s'%(id)) def get_id(self,id): ''' 定位頁面resouce-id元素 :param id: :return: ''' try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(xpath)) WebDriverWait(self.driver, 20).until(lambda driver: driver.find_element_by_id(id).is_displayed()) element = self.driver.find_element_by_id(id) return element except: # self.screenshot() # self.driver.get_screenshot_as_file("D:/error.png") log.error('未定位到元素:'+'%s'%(id)) def get_id_closebox(self, id): ''' 專門關閉彈框的 :param id: :return: ''' try: # elements = self.driver.find_elements_by_id(id) element = WebDriverWait(self.driver, 20).until(lambda x: x.find_element_by_id(id)) self.driver.implicitly_wait(2) return element except: pass def get_text_closebox(self, name): ''' 專門關閉彈框的 :param :text :return: ''' findname = "//*[@text='%s']" % (name) try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(xpath)) WebDriverWait(self.driver, 20).until(lambda driver: driver.find_element_by_id(findname).is_displayed()) element = self.driver.find_element_by_id(findname) return element except: pass def get_xpath(self,xpath): ''' 定位頁面xpath元素 :param id: :return: ''' try: # element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath(xpath)) WebDriverWait(self.driver, 20).until(lambda driver: driver.find_element_by_xpath(xpath).is_displayed()) element = self.driver.find_element_by_xpath(xpath) return element except: # self.screenshot() log.error('未定位到元素:'+'%s'%(xpath)) def get_classname(self, classname): ''' 定位頁面xpath元素 :param id: :return: ''' try: elements = WebDriverWait(self.driver, 20).until(lambda x: x.find_elements_by_class_name(classname)) self.driver.implicitly_wait(2) return elements except: # self.screenshot() log.error('未定位到元素:' + '%s' % (classname)) def get_ids(self,id): ''' 定位頁面resouce-id元素組 :param id: :return:列表 ''' try: # elements = self.driver.find_elements_by_id(id) elements = WebDriverWait(self.driver, 20).until(lambda x: x.find_elements_by_id(id)) self.driver.implicitly_wait(2) return elements except: # self.screenshot() log.error('未定位到元素:'+'%s'%(id)) def get_webcss(self,css): ''' 定位約單的web頁面 :param id: :return: ''' try: self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "WEBVIEW_com.yuedan"}) WebDriverWait(self.driver, 30).until(lambda driver: driver.find_element_by_css_selector(css).is_displayed()) element = self.driver.find_element_by_css_selector(css) element.click() self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "NATIVE_APP"}) except: # self.screenshot() # self.driver.get_screenshot_as_file("D:/error.png") log.error('未定位到元素:' + '%s' % (id)) def get_webcss_list(self,css,random): ''' 定位約單的web頁面, :param id: :return:list ''' try: self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "WEBVIEW_com.yuedan"}) elements = WebDriverWait(self.driver, 20).until(lambda x: x.find_elements_by_css_selector(css)) elements[random].click() self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "NATIVE_APP"}) except: # self.screenshot() # self.driver.get_screenshot_as_file("D:/error.png") log.error('未定位到元素:'+'%s'%(id)) def page(self): ''' 返回至指定頁面 :return: ''' i=0 while i<10: i=i+1 findname = self.find_id('com.yuedan:id/th_home_page') if findname: self.driver.find_element_by_id('com.yuedan:id/th_home_page').click() self.driver.implicitly_wait(2) break os.popen("adb shell input keyevent 4") istext = self.find_id("com.yuedan:id/bt_ok") if istext: self.driver.find_element_by_id("com.yuedan:id/bt_ok").click() def rand(self,total, num): '''生成不重複的隨機數,total總數,num生成的個數''' li = [i for i in range(total)] res = [] for i in range(num): t = random.randint(i, total - 1) res.append(li[t]) li[t], li[i] = li[i], li[t] return res def random_phonenumber(self): # 生成隨機手機號碼 area_num = 399999 # area_number = choice(area_num) seed = "1234567890" sa = [] for i in range(6): sa.append(choice(seed)) last_eightnumber = ''.join(sa) phone = str(area_num) + last_eightnumber return phone
#coding=utf-8 #author='Shichao-Dong' from GetYaml import getyaml from BaseOperate import BaseOperate from logs import log import time log = log() class Operate: def __init__(self,path,driver): self.path = path self.driver = driver self.yaml = getyaml(self.path) self.baseoperate=BaseOperate(driver) def check_operate_type(self): ''' 讀取yaml信息並執行 element_info:定位元素信息 find_type:屬性,id、xpath、text、ids operate_type: click、sendkeys、back、swipe_up 爲back就是返回,暫時就三種 增長check 用於校驗 上面三個必填,operate_type必填!!!!!! send_content:send_keys 時用到 index:ids時用到 times: :return: ''' for i in range(self.yaml.caselen()): print(self.driver.current_activity) if self.yaml.get_operate_type(i) == 'click': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: if self.yaml.get_findtype(i) == 'text': self.baseoperate.get_name(self.yaml.get_elementinfo(i)).click() elif self.yaml.get_findtype(i) == 'id': self.baseoperate.get_id(self.yaml.get_elementinfo(i)).click() elif self.yaml.get_findtype(i) == 'xpath': self.baseoperate.get_xpath(self.yaml.get_elementinfo(i)).click() elif self.yaml.get_findtype(i) == 'class_name': self.baseoperate.get_classname(self.yaml.get_elementinfo(i))[self.yaml.get_index(i)].click() elif self.yaml.get_findtype(i) == 'ids': self.baseoperate.get_ids(self.yaml.get_elementinfo(i))[self.yaml.get_index(i)].click() except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'sleep': time.sleep(self.yaml.get_sleeptime(i)) elif self.yaml.get_operate_type(i) == 'wait_activity': self.driver.wait_activity(self.yaml.get_elementinfo(i), 30) elif self.yaml.get_operate_type(i) == 'send_keys': self.driver.implicitly_wait(5) self.driver.wait_activity(self.driver.current_activity, 15) try: if self.yaml.get_findtype(i) == 'text': self.baseoperate.get_name(self.yaml.get_elementinfo(i)).send_keys(self.yaml.get_send_content(i)) elif self.yaml.get_findtype(i) == 'id': self.baseoperate.get_id(self.yaml.get_elementinfo(i)).send_keys(self.yaml.get_send_content(i)) elif self.yaml.get_findtype(i) == 'xpath': self.baseoperate.get_xpath(self.yaml.get_elementinfo(i)).send_keys(self.yaml.get_send_content(i)) elif self.yaml.get_findtype(i) == 'ids': self.baseoperate.get_ids(self.yaml.get_elementinfo(i))[self.yaml.get_index(i)].send_keys( self.yaml.get_send_content(i)) elif self.yaml.get_findtype(i) == 'idSpecial': a = True while a: self.baseoperate.get_id(self.yaml.get_elementinfo(i)).send_keys(self.yaml.get_send_content(i)) self.driver.find_element_by_id('com.yuedan:id/tv_re_sent').click() isreg = self.baseoperate.find_id('com.yuedan:id/message') log.info(isreg) if isreg: self.driver.find_element_by_id('com.yuedan:id/bt_ok').click() else: a = False except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'cycleclick': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: if self.yaml.get_findtype(i) == 'ids': yaml_text = self.yaml.get_index(i) if isinstance(yaml_text,list): for j in range(len(yaml_text)): self.baseoperate.get_ids(self.yaml.get_elementinfo(i))[j].click() else: self.baseoperate.get_ids(self.yaml.get_elementinfo(i))[self.yaml.get_index(i)].click() else: pass except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'webclick': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: if self.yaml.get_findtype(i) == 'css': self.baseoperate.get_webcss(self.yaml.get_elementinfo(i)) elif self.yaml.get_findtype(i) == 'ids': self.baseoperate.get_webcss_list(self.yaml.get_elementinfo(i),self.yaml.get_index(i)) except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'swipe_up': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: for i in range(self.yaml.get_backtimes(i)): self.baseoperate.swipe_up() except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'swipe_down': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: for i in range(self.yaml.get_backtimes(i)): self.baseoperate.swipe_down() except: self.baseoperate.page() elif self.yaml.get_operate_type(i) == 'swipe_left': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) for i in range(self.yaml.get_backtimes(i)): self.baseoperate.swipe_left() elif self.yaml.get_operate_type(i) == 'swipe_right': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) for i in range(self.yaml.get_backtimes(i)): self.baseoperate.swipe_right() elif self.yaml.get_operate_type(i) == 'clickbox': self.driver.implicitly_wait(15) self.driver.wait_activity(self.driver.current_activity, 15) try: if self.yaml.get_findtype(i) == 'id': isbox = self.baseoperate.find_id(self.yaml.get_elementinfo(i)) log.info("彈框%s"%isbox) if isbox: self.baseoperate.get_id_closebox(self.yaml.get_elementinfo(i)).click() elif self.yaml.get_findtype(i) == 'text': isbox = self.baseoperate.find_name(self.yaml.get_elementinfo(i)) if isbox: self.baseoperate.get_text_closebox(self.yaml.get_elementinfo(i)).click() except: self.baseoperate.page() def check_result(self): caselen = self.yaml.caselen() if self.yaml.get_operate_type(caselen-1) == 'check': self.driver.implicitly_wait(15) if self.yaml.get_findtype(caselen-1) == 'id': result = self.baseoperate.find_id(self.yaml.get_elementinfo(caselen - 1)) return result elif self.yaml.get_findtype(caselen-1) == 'text': result = self.baseoperate.getid_text(self.yaml.get_elementinfo(caselen - 1)) return result elif self.yaml.get_findtype(caselen-1) == 'ids': result = self.baseoperate.getids_text(self.yaml.get_elementinfo(caselen - 1))[self.yaml.get_index(caselen-1)].text return result else: pass def back_home(self): ''' 返回首頁 :return: ''' self.baseoperate.page() def isloginapp(self): '''判斷是否登陸成功''' log_eable = self.baseoperate.find_id('com.yuedan:id/login') # 登陸是否顯示 return log_eable
運行首頁用例:
config.ini 文件裏面放啓動app的那五項目,platformversion和devicename 是動態回去而後存在裏面的,以及發郵件的那些發件人,收件人,密碼等
[config] platformname = Android apppackage = com.yuedan appactivity = com.yuedan.ui.Activity_Splash platformversion = 5.0.1 devicename = R8V5T15930002010 [cmd] openappium = node /Applications/Appium.app/Contents/Resources/node_modules/appium/bin/appium.js stopappium = pkill node startserver = adb statr-server closeserver = adb kill-server checkphone = adb get-state viewphone = adb devices viewandroid = adb shell grep ro.build.version.release /system/build.prop [email] smtpsever = smtp.qq.com user = 1075937080@qq.com password = nlyislfjmcvsibaa sender = 1075937080@qq.com receiverguolinli@iyuedan.com
運行全部用例runtest.py:
#coding=utf-8 #author='Shichao-Dong' import time,os import unittest import HTMLTestRunner import smtplib import datetime from public.readConfig import Readconfig from public.Sendemail import Email from email.mime.text import MIMEText from email.mime.application import MIMEApplication from email.header import Header from email.mime.multipart import MIMEMultipart from testcase.LoginTest import login from testcase.HomeTest import home from testcase.HostTest import host from testcase.DemandTest import demand from testcase.PersonalTest import personal from testcase.ServiceTest import service PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) def testsuit(): suite = unittest.TestSuite() suite.addTests([ unittest.defaultTestLoader.loadTestsFromTestCase(login), unittest.defaultTestLoader.loadTestsFromTestCase(home), unittest.defaultTestLoader.loadTestsFromTestCase(host), unittest.defaultTestLoader.loadTestsFromTestCase(demand), unittest.defaultTestLoader.loadTestsFromTestCase(personal), ]) # runner = unittest.TextTestRunner(verbosity=2) # runner.run(suite) now=time.strftime("%y-%m-%d-%H-%M-%S") dirpath = PATH("./results/yuedan-") filename=dirpath + now +'result.html' fp=open(filename,'wb') runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='約單自動化報告',description=u'結果:') runner.run(suite) fp.close() def send_email(): #定義發件箱 conf = Readconfig() smtpsever = conf.getemailValue('smtpsever') user = conf.getemailValue('user') password = conf.getemailValue('password') sender = conf.getemailValue('sender') receiver = conf.getemailValue('receiver') sendemail = Email() msg=sendemail.email() #發送郵件 smtp=smtplib.SMTP() smtp.connect(smtpsever) smtp.login(user,password) smtp.sendmail(sender,receiver.split(','),msg.as_string()) smtp.quit() print(u'郵件發送成功') if __name__ =="__main__": testsuit() # send_email()