無規矩不成方圓。編寫**也是,如果沒有大概的框架,管理**將會是一件很頭疼的事。
先看看筆者以前寫的python指令碼:
如果只有乙個用例,這樣看著好像挺整潔的。但是當用例越來越多後,如果元素定位發生了改變,那你將要在多個類、多個方法中,去尋找那個元素,然後乙個乙個修改,這將耗費很多時間。
引入po設計模式後,管理**將會很輕鬆。
什麼是po設計模式?
po設計模式是一種業務流程與頁面元素操作分離的模式;這意味著,當ui發生變化,元素定位發生變化時,只需要在乙個地方修改即可。
下面是**目錄:
頁面元素的定位、封裝寫到pages模組中;業務流程的操作寫到test_case模組中;run_main是執行所有用例。
其它如讀取配置檔案等,可另外寫到models模組中。
模組下的檔案如下:
models模組
configfile.cfg:讀取檔案(readconfig.py):#儲存後台登入賬號密碼
[login]
username=adminpassword=admin
#平台位址
importmyunit.py:configparser
import
osconf =configparser.rawconfigparser()
#讀取檔案
conf.read(os.path.join(os.getcwd(),'
models\\configfile.cfg'))
#賬號、密碼
username = conf.get("
login
", "
username")
password = conf.get("
login
", "
password")
#url
url = conf.get("
platform
", "
url")
from selenium importpages模組pages下的登入頁面loginpage.pywebdriver
import
unittest
from models import
readconfig
class
mytest(unittest.testcase):
defsetup(self):
self.driver =webdriver.firefox()
self.driver.get(readconfig.url)
self.driver.maximize_window()
time.sleep(4)
#self.driver.implicitly_wait(2)
defteardown(self):
self.driver.quit()
from selenium.webdriver.common.by importtest_case模組test_case下的登入操作logintest.pybyfrom pages.page import
basepage
class
loginpage(basepage):
'''使用者登入頁面
'''#
元素集#
使用者名稱 username = (by.name,"
username")
#密碼passwd = (by.name,"
password")
#登入 按鈕
loginbtn = (by.xpath,"
//form[@id='frmlogin']/div[2]/footer/button")
definput_username(self,text):
print u"
輸入使用者名稱:
",text
self.input_text(self.username, text)
definput_passwd(self,text):
print u"
輸入密碼:
",text
self.input_text(self.passwd, text)
defclick_loginbtn(self):
print u"
點選 登入 按鈕
"self.click(self.loginbtn)
from models.myunit importrun_mainrun_main.py:mytest
from models import
readconfig
from pages.loginpage import
loginpage
import
unittest
import
os#所有test類都繼承mytest類;
#每次執行xx_test方法時,會先執行mytest中的setup(),結束操作後再執行teardown()
class
logintest(mytest):
'''登入測試
'''def
test_login1(self):
'''使用者名稱和密碼都為空
'''try
:
loginpage =loginpage(self.driver)
loginpage.login_sys(
"", ""
) self.assertequal(loginpage.none_user_hint(), u
"請輸入使用者名稱")
self.assertequal(loginpage.none_passwd_hint(), u
"請輸入密碼")
except
exception as msg:
print(u"
異常原因:%s
"%msg)
self.driver.get_screenshot_as_file(os.path.join(readconfig.screen_path,
'login1.png'))
raise exception("
false
")
importsysreload(sys)
sys.setdefaultencoding(
'utf-8')
import
unittest
import
htmltestrunner
from models import
readconfig
report_path =readconfig.report_path
if__name__ == '
__main__':
#suite = unittest.testsuite()
#suite.addtest(testall('test_a'))
now = time.strftime("
%y%m%d%h%m%s
",time.localtime(time.time()))
filename = report_path+now+'
result.html
'fp = open(filename,'wb'
) runner = htmltestrunner.htmltestrunner(stream=fp,title='
report
',description='
result')
discover = unittest.defaulttestloader.discover("
test_case
",pattern="
*test.py
",top_level_dir=none)
runner.run(discover)
fp.close()
設計模式 設計模式
物件導向程式設計 oop 的基本概念有 封裝,抽象,繼承,多型等,如何開發出可復用的物件導向軟體一直困擾著軟體開發人員。可復用的物件導向技術包括類的繼承,物件的組合和引數化型別 generic gof的巨著 設計模式 總結出可復用的物件導向的23個設計模式,並且歸類成 建立型模式,結構型模式和行為型...
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...
設計模式 9 設計模式
文章 head first 第一章 head first 設計模式讀書筆記 1 策略模式 觀察者模式 head first設計模式學習2 裝飾者模式 head first 設計模式3 工廠模式 head first設計模式4 命令模式 head first 設計模式5 介面卡模式和外觀模式 head...