一、项目:针对百度首页搜索功能的测试:python+selenium+unittest
1、page object 封装页面元素。
from poium importPage, NewPageElementclassBaiduPage(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、封装谷歌浏览器启动操作
importunittestfrom selenium importwebdriverclassLaunch_Brower(unittest.TestCase):"""开启/关闭 谷歌浏览器"""@classmethoddefsetUpClass(cls):
cls.driver=webdriver.Chrome()
cls.baidu_url= "https://www.baidu.com/"@classmethoddeftearDownClass(cls):
cls.driver.quit()if __name__=="__main__":
unittest.main()
3、test case:用parameterized.expand()或ddt.file_data实现参数化。
importunittest,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 importLaunch_Browerfrom page.baidu_page importBaiduPagefrom time importsleepfrom parameterized importparameterizedfrom itertools importislicefrom ddt importddt,file_data,unpack
@ddtclassTestSearchKeyword(Launch_Brower):defsearch_keyword(self,keyword):
page=BaiduPage(self.driver)
page.get(self.baidu_url)
page.search_input.send_keys(keyword)
page.search_button.click()
sleep(2)defget_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))returndata
@parameterized.expand(
get_data(base_path+
"/test_case/baidu_data/data_file.csv"))deftest_01_search_keyword(self,name,keyword):
self.search_keyword(keyword)
title=self.driver.title
self.assertEqual(title, keyword+ "_百度搜索")
@file_data("ddt.json")
@unpackdeftest_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运行测试用例生成报告。
importtime,unittestfrom HTMLTestRunner importHTMLTestRunnerimporttime,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 importconnect, cursorsfrom pymysql.err importOperationalErrorclassDB: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)exceptOperationalError as e:print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
self.cur=self.connection.cursor()definsert(self, table_name, data):for key indata:
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()defclear(self,table_name):
sql= "delete from" + table_name + ";"self.cur.execute("SET FOREIGN_KEY_CHECKS=0;")
self.cur.execute(sql)
self.connection.commit()defclose(self):
self.connection.close()#初始化数据:将测试数据插入表
definit_data(self,datas):for table_name,data indatas.items():
self.clear(table_name)for d indata:
self.insert(table_name,d)
self.close()if __name__=="__main__":
db=DB()
db.close()
二、构造测试数据:
importsys, time
sys.path.append('./db_fixture')from mysql_db importDB#定义时间
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':'alen@mail.com','sign':0,'event_id':1},
{'id':2,'realname':'jerry','phone':13511001101,'email':'sign@mail.com','sign':1,'event_id':1},
{'id':3,'realname':'tom','phone':13511001102,'email':'tom@mail.com','sign':0,'event_id':1},
],
}#初始化数据
definit_data():
DB().init_data(datas)if __name__ == '__main__':
init_data()
3、test case
importunittestimportrequestsclassGetEventListTest(unittest.TestCase):"""查询发布会信息:带用户验证"""
defsetUp(self):
self.url= "http://127.0.0.1:8000/api/sec_get_event_list/"
deftearDown(self):print(self.result)deftest_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)
importunittest,requests,hashlibimporttimeclassAddEventTest(unittest.TestCase):defsetUp(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()deftearDown(self):print(self.result)deftest_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、运行测试用例:
importtime, sys,unittest
sys.path.append('./interface')
sys.path.append('./db_fixture')from db_fixture importtest_datafrom HTMLTestRunner importHTMLTestRunner
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。
importunittest,timefrom appium importwebdriverfrom appium.webdriver.common.touch_action importTouchActionfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_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"] =TrueclassLaunch_youdao(unittest.TestCase):
@classmethoddefsetUpClass(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@classmethoddeftearDownClass(cls):
cls.driver.quit()if __name__=="__main__":
unittest.main()