• 012 python接口 参数化与封装


    '''
    时间: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
    import unittest
    from chandao_login.chandao_login_api_v2 import *
    
    class TestLogin(unittest.TestCase):
        #session = requests.session()
        def setUp(self):
            self.session = requests.session()
    
        def tearDown(self):
            self.session.cookies.clear()    # 清除缓存 - cookies
            self.session.close()            # 去除警告 - 关闭进程
    
        def test_001(self):
            ''' 登录成功: 正确账号 + 正确密码 '''
            strUser = "admin"
            strPass = "123456"
            strResult = Login(self.session, strUser, strPass)
            bResult = DecideResult(strResult)
            self.assertTrue(bResult)
    
        def test_002(self):
            ''' 登录失败: 正确账号 + 错误密码 '''
            strUser = "admin"
            strPass = "123456789"
            strResult = Login(self.session, strUser, strPass)
            bResult = DecideResult(strResult)
            self.assertFalse(bResult)
    
        def test_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
    import requests
    
    
    url = "http://127.0.0.1/zentao/user-login.htm"  # url经常变 : 做全局变量 - 做配置文件
    
    def Login(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")
        return strResult
    
    def DecideResult(strResult):
        '''
        判断结果 - 登录禅道
        :param strResult:  请求结果 - 服务端
        :return:
        '''
        if "登录失败" in strResult:
            print("登录失败")
            return False
        elif "parent.location" in strResult:
            print("登录成功")
            return True
        else:
            print("登录失败 - 其他情况")
            return False
    
    if __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
    import unittest
    from TestFunction.chandao_login_api import *
    
    class TestLogin(unittest.TestCase):
        #session = requests.session()
        def setUp(self):
            self.session = requests.session()
    
        def tearDown(self):
            self.session.cookies.clear()    # 清除缓存 - cookies
            self.session.close()            # 去除警告 - 关闭进程
    
        def test_001(self):
            ''' 登录成功: 正确账号 + 正确密码 '''
            strUser = "admin"
            strPass = "123456"
            strResult = Login(self.session, strUser, strPass)
            bResult = DecideResult(strResult)
            self.assertTrue(bResult)
    
        def test_002(self):
            ''' 登录失败: 正确账号 + 错误密码 '''
            strUser = "admin"
            strPass = "123456789"
            strResult = Login(self.session, strUser, strPass)
            bResult = DecideResult(strResult)
            self.assertFalse(bResult)
    
        def test_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
    import requests
    
    
    url = "http://127.0.0.1/zentao/user-login.htm"  # url经常变 : 做全局变量 - 做配置文件
    
    def Login(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")
        return strResult
    
    
    def DecideResult(strResult):
        '''
        判断结果 - 登录禅道
        :param strResult:  请求结果 - 服务端
        :return:
        '''
        if "登录失败" in strResult:
            print("登录失败")
            return False
        elif "parent.location" in strResult:
            print("登录成功")
            return True
        else:
            print("登录失败 - 其他情况")
            return False
    
    
    if __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
    import unittest
    import os
    from Common import HTMLTestRunner_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
    import unittest
    from TestLagou.Lagou_login_api import *
    
    
    class TestLogin(unittest.TestCase):
        def setUp(self):
            self.session = requests.session()
            self.lgw = LoginLgw(self.session)
    
        def tearDown(self):
            self.session.cookies.clear()    # 清除缓存 - cookies
            self.session.close()            # 去除警告 - 关闭进程
    
        def test_001(self):
            ''' 登录成功: 正确账号 + 正确密码 '''
            ServerResult = self.lgw.login("13581906014", "1358190lago*")
            bResult = self.lgw.CheckResult(ServerResult)
            self.assertTrue(bResult)
    
        def test_002(self):
            ''' 登录失败: 正确账号 + 错误密码 '''
            ServerResult = self.lgw.login("13581906014", "1234567895*")
            bResult = self.lgw.CheckResult(ServerResult)
            self.assertFalse(bResult)
    
        def test_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
    import requests
    import re
    from bs4 import BeautifulSoup
    import urllib3
    import hashlib
    urllib3.disable_warnings()
    import sys
    
    class LoginLgw():
        def __init__(self, s):
            self.s = s
    
        def getToeknCode(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]
                return tokenCode
            except:
                print("Get Faild")
                tokenCode['X_Anti_Forge_Token'] = ""
                tokenCode['X_Anti_Forge_Code'] = ""
                return tokenCode
    
        def encryptPwd(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加密
            return passwd
    
        def login(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)
            return r
    
        def CheckResult(self, strServerResult):
            '''
            判断结果 - 登录拉钩
            :param strServerResult: 返回数据 - 服务器
            :return:
            '''
            deictResult = strServerResult.json()
    
            if "操作成功" in deictResult["message"]:
                print("登录成功")
                return True
            else:
                print("登录失败: %s" %strServerResult.text)
                return False
    
    if __name__ == "__main__":
        s = requests.session()
        lgw = LoginLgw(s)
        r = lgw.login("13581906014", "1358190lago1*")
        bReslut = lgw.CheckResult(r)
        print("%r %s" %(bReslut, type(bReslut)))

      4 执行结果

  • 相关阅读:
    LWE Open Question
    Lattice Problem
    Small Program about Error Distribution
    Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务
    Photon PUN 三 RPCs & RaiseEvent
    Photon PUN 二 大厅 & 房间
    Photon PUN 一 介绍
    通用麻将胡牌算法
    一款麻将小游戏的准备工作
    ABC203
  • 原文地址:https://www.cnblogs.com/huafan/p/9906010.html
Copyright © 2020-2023  润新知