'''时间:2018/11/04
目录:
一: 禅道登录
1 工程结构
2 unittest文件
3 实现功能文件
4 执行结果
二: 禅道登录 - 报告
1 工程结构
2 Common
3 TestCase
4 TestFunction
5 TestReport
6 run_all.py
7 执行结果
三: 拉勾网登录
1 工程结构
2 unittest文件
3 实现功能文件
4 执行结果'''
一: 禅道登录
1 工程结构
1 : 主要两个文件,unittest文件和操作文件。
2 : unittest文件的功能:输入数据、预期结果、断言判断。
2 : 操作文件的功能:步骤执行、返回实际结果 。
2 unittest文件
#coding:utf-8
importunittestfrom chandao_login.chandao_login_api_v2 import *
classTestLogin(unittest.TestCase):#session = requests.session()
defsetUp(self):
self.session=requests.session()deftearDown(self):
self.session.cookies.clear()#清除缓存 - cookies
self.session.close() #去除警告 - 关闭进程
deftest_001(self):'''登录成功: 正确账号 + 正确密码'''strUser= "admin"strPass= "123456"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertTrue(bResult)deftest_002(self):'''登录失败: 正确账号 + 错误密码'''strUser= "admin"strPass= "123456789"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertFalse(bResult)deftest_003(self):'''登录失败: 错误账号 + 错误密码'''strUser= "admin123"strPass= "123456789"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertFalse(bResult)if __name__ == '__main__':
unittest.main()
3 实现功能文件
#coding:utf-8
importrequests
url= "http://127.0.0.1/zentao/user-login.htm" #url经常变 : 做全局变量 - 做配置文件
defLogin(session, strUser, strPass):'''登录禅道
:param session: session
:param strUser: 用户名
:param strPass: 密码
:return: 请求结果 - 服务端'''body={"account": strUser,"password": strPass,"keepLogin[]": "on","referer": "/zentao/my.html"}
r= session.post(url, data =body)
strResult= r.content.decode("utf-8")returnstrResultdefDecideResult(strResult):'''判断结果 - 登录禅道
:param strResult: 请求结果 - 服务端
:return:'''
if "登录失败" instrResult:print("登录失败")returnFalseelif "parent.location" instrResult:print("登录成功")returnTrueelse:print("登录失败 - 其他情况")returnFalseif __name__ == '__main__':
s=requests.session()
result= Login(s, "admin", "123456")
DecideResult(result)
4 执行结果
1 : 测试用例全部运行pass。
1 : 测试用例有failed。
二: 禅道登录 - 报告
1 工程结构
1 : 由5个部分组成:4个文件夹 + 1个运行文件。
2 : Common文件夹: 存放公共的文件
3 : TestCase文件夹: 存放unittest文件
4 : TestFunction文件夹: 存放功能操作文件
5 : TestReport文件夹: 存放测试报告文件
6 : run_all.py: 执行测试、生成报告。
2 Common
1 : 使用第三方 HTMLTestRunner_cn.py,方便查看测试结果。
3 TestCase
#coding:utf-8
importunittestfrom TestFunction.chandao_login_api import *
classTestLogin(unittest.TestCase):#session = requests.session()
defsetUp(self):
self.session=requests.session()deftearDown(self):
self.session.cookies.clear()#清除缓存 - cookies
self.session.close() #去除警告 - 关闭进程
deftest_001(self):'''登录成功: 正确账号 + 正确密码'''strUser= "admin"strPass= "123456"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertTrue(bResult)deftest_002(self):'''登录失败: 正确账号 + 错误密码'''strUser= "admin"strPass= "123456789"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertFalse(bResult)deftest_003(self):'''登录失败: 错误账号 + 错误密码'''strUser= "admin123"strPass= "123456789"strResult=Login(self.session, strUser, strPass)
bResult=DecideResult(strResult)
self.assertFalse(bResult)if __name__ == '__main__':
unittest.main()
4 TestFunction
#coding:utf-8
importrequests
url= "http://127.0.0.1/zentao/user-login.htm" #url经常变 : 做全局变量 - 做配置文件
defLogin(session, strUser, strPass):'''登录禅道
:param session: session
:param strUser: 用户名
:param strPass: 密码
:return: 请求结果 - 服务端'''body={"account": strUser,"password": strPass,"keepLogin[]": "on","referer": "/zentao/my.html"}
r= session.post(url, data =body)
strResult= r.content.decode("utf-8")returnstrResultdefDecideResult(strResult):'''判断结果 - 登录禅道
:param strResult: 请求结果 - 服务端
:return:'''
if "登录失败" instrResult:print("登录失败")returnFalseelif "parent.location" instrResult:print("登录成功")returnTrueelse:print("登录失败 - 其他情况")returnFalseif __name__ == '__main__':
s=requests.session()
result= Login(s, "admin", "123456")
DecideResult(result)
5 TestReport
1 : 运行完程序,生成一个report.html文件。
1 : 测试用例全部运行pass。
1 : 测试用例有failed。
6 run_all.py
#coding:utf-8
importunittestimportosfrom Common importHTMLTestRunner_cn#路径兼容 - windows/mac
cur_path = os.path.dirname(os.path.realpath(__file__)) #获取路径 - 当前脚本
cur_path = os.path.join(cur_path, "TestCase") #拼接路径
#显示结果 - unnitest
pattern = "test*.py" #匹配文件
discover = unittest.defaultTestLoader.discover(start_dir = cur_path, pattern =pattern)print(discover)#路径兼容 - windows/mac
cur_path = os.path.dirname(os.path.realpath(__file__)) #获取路径 - 当前脚本
report_path = os.path.join(cur_path, "TestReport", "report.html")
fp= open(report_path, "wb")
runner= HTMLTestRunner_cn.HTMLTestRunner(stream = fp, #报告路径
title = "接口测试用例报告", #报告标题
description = "测试用例详情报告", #报告描述
retry = 1, #错误重写执行
verbosity = 2) #注释显示
runner.run(discover)
三: 拉勾网登录
1 工程结构
1 : 主要两个文件,unittest文件和操作文件。
2 : unittest文件的功能:输入数据、预期结果、断言判断。
2 : 操作文件的功能:步骤执行、返回实际结果 。
2 unittest文件
#coding:utf-8
importunittestfrom TestLagou.Lagou_login_api import *
classTestLogin(unittest.TestCase):defsetUp(self):
self.session=requests.session()
self.lgw=LoginLgw(self.session)deftearDown(self):
self.session.cookies.clear()#清除缓存 - cookies
self.session.close() #去除警告 - 关闭进程
deftest_001(self):'''登录成功: 正确账号 + 正确密码'''ServerResult= self.lgw.login("13581906014", "1358190lago*")
bResult=self.lgw.CheckResult(ServerResult)
self.assertTrue(bResult)deftest_002(self):'''登录失败: 正确账号 + 错误密码'''ServerResult= self.lgw.login("13581906014", "1234567895*")
bResult=self.lgw.CheckResult(ServerResult)
self.assertFalse(bResult)deftest_003(self):'''登录失败: 错误账号 + 错误密码'''ServerResult= self.lgw.login("123456", "1234567895*")
bResult=self.lgw.CheckResult(ServerResult)
self.assertFalse(bResult)if __name__ == '__main__':
unittest.main()
3 实现功能文件
#coding:utf-8
importrequestsimportrefrom bs4 importBeautifulSoupimporturllib3importhashlib
urllib3.disable_warnings()importsysclassLoginLgw():def __init__(self, s):
self.s=sdefgetToeknCode(self):'''获取拉勾网 - token和code
:return: {"X_Anti_Forge_Token":"xxx", "X_Anti_Forge_Code":"xxx"}'''
#更新数据 - 头部信息
url = "https://passport.lagou.com/login/login.html"head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
}
self.s.headers.update(head)#获取数据 - token和code
data = self.s.get(url, verify =False)
soup= BeautifulSoup(data.content, "html.parser", from_encoding="utf-8")
tokenCode={}try:
t= soup.find_all("script")[1].get_text()
tokenCode['X_Anti_Forge_Token'] = re.findall(r"Token = '(.+?)'", t)[0]
tokenCode['X_Anti_Forge_Code'] = re.findall(r"Code = '(.+?)'", t)[0]returntokenCodeexcept:print("Get Faild")
tokenCode['X_Anti_Forge_Token'] = ""tokenCode['X_Anti_Forge_Code'] = ""
returntokenCodedefencryptPwd(self, passwd):'''密码加密
:param passwd: 原始密码
:return: 加密密码'''passwd= hashlib.md5(passwd.encode("utf-8")).hexdigest() #md5加密
passwd = "veenike" + passwd + "veenike" #veennike : js文件 - 写死的值
passwd = hashlib.md5(passwd.encode("utf-8")).hexdigest() #md5加密
returnpasswddeflogin(self, user, password):'''登录拉勾网
:param user: 用户名
:param password: 密码
:return: 登录成功 - 服务信息'''
#获取数据 - token和code
tokenCode =self.getToeknCode()#print(tokenCode)
#密码加密
password =self.encryptPwd(password)#print(password)
#更新数据 - 头部信息
url = "https://passport.lagou.com/login/login.json"head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With": "XMLHttpRequest","X-Anit-Forge-Token": tokenCode['X_Anti_Forge_Token'],"X-Anit-Forge-Code": tokenCode['X_Anti_Forge_Code'],"Referer": "https://passport.lagou.com/login/login.html",
}
self.s.headers.update(head)#登录网站
body ={"isValidate":'true',"username": user,"password": password,"request_form_verifyCode": "","submit": ""}
r= self.s.post(url, data=body, verify=False)returnrdefCheckResult(self, strServerResult):'''判断结果 - 登录拉钩
:param strServerResult: 返回数据 - 服务器
:return:'''deictResult=strServerResult.json()if "操作成功" in deictResult["message"]:print("登录成功")returnTrueelse:print("登录失败: %s" %strServerResult.text)returnFalseif __name__ == "__main__":
s=requests.session()
lgw=LoginLgw(s)
r= lgw.login("13581906014", "1358190lago1*")
bReslut=lgw.CheckResult(r)print("%r %s" %(bReslut, type(bReslut)))
4 执行结果