def __init__(self, url=None, method="GET", parameters=None, cookie=None, headers={}, get_cookie_url=None,
              get_cookie_request_data=None,
              get_cookie_headers=[('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]):
     '''
     :param url: 请求使用的url,由于发送cookie的请求方法可以单独传url故此参数非必填。使用request方法请求时必填。
     :param method: 请求的方法
     :param parameters: 请求的参数
     :param cookie: cookie
     :param headers: 请求头
     :param get_cookie_url: 获取cookie的url,如果调用request_with_cookies时此参数必须传
     :param get_cookie_request_data: 获取cookie时需要传的参数
     :param get_cookie_headers: 获取cookie时需要加的请求头
     '''
     try:
         # 解析url
         if url is None:
             self.__url = None
         else:
             try:
                 if type(url) == bytes:
                     self.__url = url.decode("utf-8")
                 if type(url) == str:
                     self.__url = url
             except:
                 self.__url = url
             logger.debug(self.__url)
             scheme, rest = urllib_parse.splittype(self.__url)
             # 拆分域名和路径
             logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
             self.__host_absolutely, self.__path = urllib_parse.splithost(rest)
             host_list = self.__host_absolutely.split(":")
             if len(host_list) == 1:
                 self.__host = host_list[0]
                 self.__port = 80
             elif len(host_list) == 2:
                 self.__host = host_list[0]
                 self.__port = host_list[1]
         # 对所传参数进行处理
         self.__method = method
         self.__data = parameters
         self.__cookie = cookie
         if parameters != None:
             self.__parameters_urlencode_deal = urllib_parse.urlencode(parameters)
         else:
             self.__parameters_urlencode_deal = ""
         self.__jdata = simplejson.dumps(parameters, ensure_ascii=False)
         self.__headers = headers
         self.__opener = None
         self.__get_cookie_request_data = None
         if get_cookie_url is not None:
             cj = ckjar.CookieJar()
             self.__opener = urllib_request.build_opener(urllib_request.HTTPCookieProcessor(cj))
             self.__opener.addheaders = get_cookie_headers
             if get_cookie_request_data is not None:
                 self.__get_cookie_request_data = urllib_parse.urlencode(get_cookie_request_data).encode("utf-8")
             self.__opener.open(get_cookie_url, self.__get_cookie_request_data)
     except Exception as e:
         logger.error(e)
         logger.exception(u"捕获到错误如下:")
def generator_const(days_num):
    '''
    此方法生成的是110105开头的当前年月日减去参数天数的随机身份证
    :param days_num: 用来减的天数
    :return: 生成的身份证字符串
    '''
    id = str(110105)
    da = date.today() + timedelta(days=days_num)
    id += da.strftime('%Y%m%d')
    id += str(random.randint(100, 300))  # ,顺序号简单处理
    i = 0
    count = 0
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]  # 权重项
    check_code = {'0': '1', '1': '0', '2': 'X', '3': '9', '4': '8', '5': '7', '6': '6', '7': '5', '8': '5',
                  '9': '3', '10': '2'}  # 校验码映射
    logger.debug(id)
    for i in range(0, len(id)):
        count += int(id[i]) * weight[i]
    id += check_code[str(count % 11)]  # 算出校验码
    return id
def test_tmp_func1():
    logger.debug("测试1")
    print("测试2")
    assert tmp_func1(0) == 1
# -*- coding:utf-8 -*-

#########################################################
#
# 在文件目录下命令行执行py.test可直接执行所有带test开头的文件的测试,执行py.case -h可看帮助
# 执行py.case -k "first"只取params中的0,执行py.case -s则打印程序中的print()
# 如果需要打日志则直接配置logging进行日志输出即可
#
#########################################################
import sys
import pytest
from common.util.logger import logger

sys.path.append("../")
logger.debug("测试")


# 被测函数
def tmp_func1(param1):
    result = param1 + 1
    return result


#########################################################
#
# @pytest.fixture(scope=function,params=None,autouse=False,ids=None)装饰器
# scope是范围,有四个选项function  (default),  class ,  module ,  session,一般选择默认即可。
# params。参数,程序中通过“形参.param”获得并使用
# autouse是配置项,如果不打算把装饰后的函数放到测试用例函数的形参中,这个值设置为True,则所有的函数都会引用。实际使用中
# 大多需要把装饰后的函数放到测试用例函数的形参中,故一般使用默认值False。
# ids是params对应的key,命令行执行测试时可以指定执行,使用-k。
    def output_with_excel(self, template_file, sheet_count, data_list):
        '''
        :param template_file: 模板文件路径
        :param sheet_count: 模板文件容sheet的个数,比如5个sheet页通过这个参数可以指定就用3个
        :param data_list: 数据list,其中包含sheet页list,表头list,数据list
        本方法中均使用list进行数据操作,由于模板中第一行为标题,故插入数据的行数索引从1开始
        '''
        try:
            data = xlrd.open_workbook(template_file)
            sheet_name = data.sheet_names()
            sheet_list = list()
            # 将模板文件sheet对象存入sheet_list列表
            for i in range(sheet_count):
                sheet_list.append(data.sheets()[i])
            template_data_list = list()
            # 将模板文件每个sheet的数据list存入tempLate_data_list列表
            for i_sheet in sheet_list:
                template_data_list.append(i_sheet.row_values(0))
            output_file = xlwt.Workbook()
            # 字体设定
            font = xlwt.Font()
            font.bold = True
            # 边框设定
            borders = xlwt.Borders()
            borders.left = 1
            borders.right = 1
            borders.top = 1
            borders.bottom = 1
            # 背景色设定
            backcolor = xlwt.Pattern()
            backcolor.pattern = xlwt.Pattern.SOLID_PATTERN
            backcolor.pattern_fore_colour = 5
            style = xlwt.XFStyle()
            style.font = font
            style.borders = borders
            style.pattern = backcolor
            output_file_sheet_list = list()
            # 输出文件添加sheet并给予标题,对象存入output_file_sheet_list列表
            for j in range(sheet_count):
                output_file_sheet_list.append(
                    output_file.add_sheet(sheet_name[j],
                                          cell_overwrite_ok=True))
            # j_sheet_num为sheet页的索引
            for j_sheet_num in range(len(sheet_list)):
                # j_sheet_row_index为模板文件template_dataList的索引
                for j_sheet_row_index in range(
                        len(template_data_list[j_sheet_num])):
                    output_file_sheet_list[j_sheet_num].write(
                        0, j_sheet_row_index,
                        template_data_list[j_sheet_num][j_sheet_row_index],
                        style)

            # 数据格式为{"sheet页数":{"列数":[当前添加的数据1,当前添加的数据2]}}
            filter_dict = dict()
            logger.debug("++++++++++++++++++++++++++++++")
            logger.debug(data_list)
            # 以追加方式添加数据
            for data_num in range(len(data_list[0])):
                logger.debug(data_num)
                logger.debug(data_list)
                # 当前sheet的索引
                data_sheet_num = int(data_list[0][data_num]) - 1
                data_row_num = 1
                data_col_num = int(data_list[1][data_num]) - 1
                logger.debug("===================================")
                logger.debug(data_sheet_num)
                logger.debug(data_col_num)
                # 判断当前sheet页数是否在filter_dict中,即当前sheet是否曾经出现过
                if str(data_sheet_num) not in filter_dict:
                    # 当前sheet页数不存在filter_dict,添加对应data_sheet_num字典
                    filter_dict[str(data_sheet_num)] = {}
                    # 增加对应列数的数据list
                    filter_dict[str(data_sheet_num)][str(
                        data_col_num)] = list()
                    # 由于sheet页数第一次出现,故数据也一定第一次出现,所以之列列表中添加值
                    filter_dict[str(data_sheet_num)][str(data_col_num)].append(
                        data_col_num)
                else:
                    # 当前sheet页数存在filter_dict中,判断当前列数是否在列数字典中,即当前列数是否出现过
                    if str(data_col_num) not in filter_dict[str(
                            data_sheet_num)]:
                        # 当前列数未出现过,添加列表
                        filter_dict[str(data_sheet_num)][str(
                            data_col_num)] = list()
                        # 向列数字典列表插数据,但插入数据的当前行数为初始值,即1
                        filter_dict[str(data_sheet_num)][str(
                            data_col_num)].append(data_col_num)
                    else:
                        # 当前列数出现过。向列数字典列表插数据,插入数据的当前行数为总出现的次数
                        filter_dict[str(data_sheet_num)][str(
                            data_col_num)].append(data_col_num)
                        data_row_num = len(filter_dict[str(data_sheet_num)][
                            str(data_col_num)])
                logger.debug(filter_dict)
                data_preview_add = data_list[2][data_num]
                # 向excel中插入数据
                output_file_sheet_list[data_sheet_num].write(
                    data_row_num, data_col_num, data_preview_add)

            output_file.save(str(TimeStamp.time_stamp()) + ".xls")

        except:
            logger.exception("发现错误")
 def __init__(self,
              url=None,
              method="GET",
              parameters=None,
              cookie=None,
              headers={},
              get_cookie_url=None,
              get_cookie_request_data=None,
              get_cookie_headers=[
                  ('User-agent',
                   'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')
              ]):
     '''
     :param url: 请求使用的url,由于发送cookie的请求方法可以单独传url故此参数非必填。使用request方法请求时必填。
     :param method: 请求的方法
     :param parameters: 请求的参数
     :param cookie: cookie
     :param headers: 请求头
     :param get_cookie_url: 获取cookie的url,如果调用request_with_cookies时此参数必须传
     :param get_cookie_request_data: 获取cookie时需要传的参数
     :param get_cookie_headers: 获取cookie时需要加的请求头
     '''
     try:
         # 解析url
         if url is None:
             self.__url = None
         else:
             try:
                 if type(url) == bytes:
                     self.__url = url.decode("utf-8")
                 if type(url) == str:
                     self.__url = url
             except:
                 self.__url = url
             logger.debug(self.__url)
             scheme, rest = urllib_parse.splittype(self.__url)
             # 拆分域名和路径
             logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
             self.__host_absolutely, self.__path = urllib_parse.splithost(
                 rest)
             host_list = self.__host_absolutely.split(":")
             if len(host_list) == 1:
                 self.__host = host_list[0]
                 self.__port = 80
             elif len(host_list) == 2:
                 self.__host = host_list[0]
                 self.__port = host_list[1]
         # 对所传参数进行处理
         self.__method = method
         self.__data = parameters
         self.__cookie = cookie
         if parameters != None:
             self.__parameters_urlencode_deal = urllib_parse.urlencode(
                 parameters)
         else:
             self.__parameters_urlencode_deal = ""
         self.__jdata = simplejson.dumps(parameters, ensure_ascii=False)
         self.__headers = headers
         self.__opener = None
         self.__get_cookie_request_data = None
         if get_cookie_url is not None:
             cj = ckjar.CookieJar()
             self.__opener = urllib_request.build_opener(
                 urllib_request.HTTPCookieProcessor(cj))
             self.__opener.addheaders = get_cookie_headers
             if get_cookie_request_data is not None:
                 self.__get_cookie_request_data = urllib_parse.urlencode(
                     get_cookie_request_data).encode("utf-8")
             self.__opener.open(get_cookie_url,
                                self.__get_cookie_request_data)
     except Exception as e:
         logger.error(e)
         logger.exception(u"捕获到错误如下:")
def test_access_success_protocol(ytdyc_mobile_fixture_protocol):
    opener = ytdyc_mobile_fixture_protocol
    html = opener.open(Ytdyc.TEST_URL.value)
    logger.debug(html.read())
    time.sleep(3)