Exemplo n.º 1
0
 def __init__(self, i=0, install_flag=None):
     write_file = WriteUserConfig()
     self.device = write_file.get_value('device' + str(i), 'deviceName')
     self.port = write_file.get_value('device' + str(i), 'port')
     read = ReadIni(conftest.env_dir)
     self.env_flag = read.get_value('noReset_flag_android', 'caps')
     if install_flag is 'yes':
         self.apk_dir = conftest.apk_path
     else:
         self.apk_dir = read.get_value('apk_dir', 'app')
Exemplo n.º 2
0
 def __init__(self):
     # 实例化ReadIni类的一个对象
     self.read_ini = ReadIni()
     # 通过调用read_ini的指定方法获得excel的数据
     self.excel_data = self.read_ini.get_excel_path()
     # 通过调用read_ini的指定方法获得参数的json数据路径
     self.params_data_path = self.read_ini.get_params_json_path()
     # 通过调用read_ini的指定方法获得期望结果的json数据路径
     self.exception_data_path = self.read_ini.get_exception_json_path()
     # 通过openpyxl的load_workbook方法实例化一个workbook对象
     self.wb = openpyxl.load_workbook(self.excel_data)
     # 通过workbook对象本质是一个字典 通过表名key去 获得一个worksheet对象 通过readini的getsheet方法获得ini文件中的键名 也就是key
     self.ws = self.wb[self.read_ini.get_sheet_name()]
Exemplo n.º 3
0
    def test_useadd_failed(self, username, realname, password,
                           confirm_password, email, expectation,
                           prompt_selector, case_number, current_test_module):

        try:
            # 添加失败动作
            self.useadd_test.useradd(username, realname, password,
                                     confirm_password, email)
            # 断言动作 获取弹出的提示窗的文本
            actual_prompt_text = self.useadd_test.get_text(prompt_selector,
                                                           wait=30)
            # 断言 实际提示窗文本与期望文本对比
            self.assertTrue(expectation == actual_prompt_text,
                            '实际提示窗文本与期望文本不相等')
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.useadd_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-{}.png".format(current_test_module,
                                                  case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))
        finally:
            self.useadd_test.chick_out_useadd()
Exemplo n.º 4
0
    def test_useadd_succeed(self, username, realname, password,
                            confirm_password, email, expectation, case_number,
                            current_test_module):
        '''

        :param username: 用户名称
        :param realname: 用户真实姓名
        :param password: 用户密码
        :param confirm_password:再次确认密码
        :param email: 用户邮箱
        :param expectation: 期望用户名
        :return:
        '''
        try:
            # 添加成功动作
            self.useadd_test.useradd(username, realname, password,
                                     confirm_password, email)
            # 断言动作 获取最后一个数据的用户姓名文本
            actual_text = self.useadd_test.get_user_text()
            # 断言 实际用户姓名文本与输出用户姓名文本对比
            self.assertEqual(expectation, actual_text, '实际用户姓名与期望用户姓名不一致')
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.useadd_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—{}-{}-{}.png".format(current_test_module,
                                                 case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))
Exemplo n.º 5
0
def setup_module():
    # 必须使用@classmethod 装饰器,所有test运行前运行一次
    global operation, driver, read
    # 调用get_driver
    read = ReadIni(conftest.userinfo_dir)
    base_driver = BaseDriver()
    driver = base_driver.android_driver()
    # 实例化Operation
    operation = Operation(driver)
    print('[MyLog]--------OPERATION is inited NOW')
Exemplo n.º 6
0
 def setUpClass(cls):
     # 必须使用@classmethod 装饰器,所有test运行前运行一次
     global operation, driver, read
     # 调用get_driver
     read = ReadIni(conftest.userinfo_dir)
     server = Server()
     server.main('android')
     base_driver = BaseDriver()
     driver = base_driver.android_driver()
     # 实例化Operation
     operation = Operation(driver)
Exemplo n.º 7
0
 def __init__(self, run_type='run_test_classname', report_type='tr1', mode_parameter=Login_Test,
              email_title='email标题',
              report_title='测试报告标题', report_tester='Jakiro', report_desc='测试描述', report_name='report-{}.html'):
     # 找到测试用例的路径
     self.case_path = ReadIni().get_case_path()
     # 生成报告路径
     tt = time.strftime('%Y-%m-%d-%H-%M-%S')
     self.report_path = ReadIni().get_report_path() + report_name.format(tt)
     # 报告类型
     self.report_type = report_type
     # 用例加载类型
     self.run_type = run_type
     # 用例加载方式类型
     self.mode_parameter = mode_parameter
     # 邮件标题
     self.email_title = email_title
     # 报告标题
     self.report_title = report_title
     # 报告作者
     self.report_tester = report_tester
     # 报告描述
     self.report_desc = report_desc
Exemplo n.º 8
0
    def test_login_success(self, username, password, expectation, case_number,
                           current_test_module):
        '''
        登录成功的用例
        :param username:
        :param password:
        :param expectation:
        :param case_number:
        :return:
        '''
        try:
            # 登录流程
            self.login_test.login(username, password)
            # 断言,获取文本n
            # actual_name = self.login_test.get_login_success_text()
            # 打印文本获取成功
            # self.current_logging.info('文本获取成功')
            # 通过数据库进行断言
            actual_name = read_sql(expectation)

            # 断言失败时,才会报错  先填期望,再填实际
            self.assertEqual(expectation, actual_name, '预期用户名与实际用户名结果不一致')
        except Exception as e:
            tt = time.strftime('%Y-%m-%d-%H-%M-%S')
            # print(tt,e)
            # 错误时调用base中的截图方法截图
            # self.login_test.get_screenshot_as_file(r'C:\Users\Administrator\codes\test\project\ranzhi_project\result\screenshot\screenshot--{}.png'.format(tt))
            self.login_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-date-{}.png".format(current_test_module,
                                                       case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            # 如果不是AssertError 会报Error A 会报failed为么同步用例执行结果,一般用A

        finally:
            try:
                self.login_test.check_out()
            except Exception:
                self.login_test.click_login_failed_box_accept()
Exemplo n.º 9
0
    def test_login_failed(self, username, password, selector, expectation,
                          case_number, current_test_module):
        '''
        登录失败的用例
        :param username: 用户名
        :param password: 密码
        :param expectation: 期望结果
        :return:
        '''
        try:
            # 登录流程
            self.login_test.login(username, password)
            # 断言,获取警告窗文本
            # actual_alert_text = self.login_test.get_failed_alert_text()
            # 断言优化
            actual_alert_text = self.login_test.get_text(selector, wait=20)
            # 断言,警告窗文本对比
            # self.assertEqual(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致')
            self.assertIn(expectation, actual_alert_text,
                          '预期用户名与实际用户名结果不一致。。。')
            # self.assertTrue(expectation == actual_alert_text )
            # 后面需要填入一个bowl值表达式
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.login_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-date-{}.png".format(current_test_module,
                                                       case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))

        finally:
            self.login_test.click_login_failed_box_accept()
Exemplo n.º 10
0
class Login_Test(unittest.TestCase):
    # succeed_data_excel = read_excel_data(
    #     r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\login_data.xlsx', 'test_login_success')
    # failed_data_excel = read_excel_data(
    #     r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\login_data.xlsx', 'test_login_failed')
    # succeed_data_yaml = read_yaml_data(
    #     r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\test_data.yaml')
    # succeed_data_json = read_json_data(get_file_path(r'ranzhi_project/data_config/test_data.json'))

    # 通过ReadIni类获取实例路径
    # succeed_data_excel = read_excel_data(ReadIni().get_excel_path(), 'test_login_success')
    login_data_json = read_json_data(ReadIni().get_json_path())
    # 实例化logging对象 参数为当前文件路径
    ttt = time.strftime('%Y-%m-%d-%H-%M-%S')
    current_test = 'login_test'
    current_logging = get_logging(
        ReadIni().get_logging_path() +
        'logging-{}-{}.log'.format(current_test, ttt))
    login_data_yaml = read_yaml_data(ReadIni().get_yaml_path())

    # 通过setUp和tearDown固件进行用例配置
    def setUp(self):
        self.login_test = Login_page('Chrome')
        # print(self.succeed_data_lists)

    def tearDown(self):
        self.login_test.quit()

    # 通过setUpClass和tearDownClass固件进行用例配置
    # @classmethod  # 需要加装饰器,把他继承的cls改为self 可以放前置条件 和连接数据库
    # def setUpClass(self):
    #     self.login_test = Login_page('Chrome')
    #     # 连接数据库
    #
    # @classmethod
    # def tearDownClass(self):
    #     self.login_test.quit()

    @parameterized.expand(login_data_yaml['test_login_success'])
    # @parameterized.expand(succeed_data_excel)
    # @parameterized.expand(login_data_json['test_login_success'])
    # @parameterized.expand([[
    #     "9527258742",
    #     "123456",
    #     "李越川258742",
    #     "2"
    # ], ])
    def test_login_success(self, username, password, expectation, case_number,
                           current_test_module):
        '''
        登录成功的用例
        :param username:
        :param password:
        :param expectation:
        :param case_number:
        :return:
        '''
        try:
            # 登录流程
            self.login_test.login(username, password)
            # 断言,获取文本n
            # actual_name = self.login_test.get_login_success_text()
            # 打印文本获取成功
            # self.current_logging.info('文本获取成功')
            # 通过数据库进行断言
            actual_name = read_sql(expectation)

            # 断言失败时,才会报错  先填期望,再填实际
            self.assertEqual(expectation, actual_name, '预期用户名与实际用户名结果不一致')
        except Exception as e:
            tt = time.strftime('%Y-%m-%d-%H-%M-%S')
            # print(tt,e)
            # 错误时调用base中的截图方法截图
            # self.login_test.get_screenshot_as_file(r'C:\Users\Administrator\codes\test\project\ranzhi_project\result\screenshot\screenshot--{}.png'.format(tt))
            self.login_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-date-{}.png".format(current_test_module,
                                                       case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            # 如果不是AssertError 会报Error A 会报failed为么同步用例执行结果,一般用A

        finally:
            try:
                self.login_test.check_out()
            except Exception:
                self.login_test.click_login_failed_box_accept()

    # @parameterized.expand(failed_data_excel)
    @parameterized.expand(login_data_yaml['test_login_failed'])
    def test_login_failed(self, username, password, selector, expectation,
                          case_number, current_test_module):
        '''
        登录失败的用例
        :param username: 用户名
        :param password: 密码
        :param expectation: 期望结果
        :return:
        '''
        try:
            # 登录流程
            self.login_test.login(username, password)
            # 断言,获取警告窗文本
            # actual_alert_text = self.login_test.get_failed_alert_text()
            # 断言优化
            actual_alert_text = self.login_test.get_text(selector, wait=20)
            # 断言,警告窗文本对比
            # self.assertEqual(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致')
            self.assertIn(expectation, actual_alert_text,
                          '预期用户名与实际用户名结果不一致。。。')
            # self.assertTrue(expectation == actual_alert_text )
            # 后面需要填入一个bowl值表达式
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.login_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-date-{}.png".format(current_test_module,
                                                       case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))

        finally:
            self.login_test.click_login_failed_box_accept()
Exemplo n.º 11
0
class ReadExcel(object):
    def __init__(self):
        # 实例化ReadIni类的一个对象
        self.read_ini = ReadIni()
        # 通过调用read_ini的指定方法获得excel的数据
        self.excel_data = self.read_ini.get_excel_path()
        # 通过调用read_ini的指定方法获得参数的json数据路径
        self.params_data_path = self.read_ini.get_params_json_path()
        # 通过调用read_ini的指定方法获得期望结果的json数据路径
        self.exception_data_path = self.read_ini.get_exception_json_path()
        # 通过openpyxl的load_workbook方法实例化一个workbook对象
        self.wb = openpyxl.load_workbook(self.excel_data)
        # 通过workbook对象本质是一个字典 通过表名key去 获得一个worksheet对象 通过readini的getsheet方法获得ini文件中的键名 也就是key
        self.ws = self.wb[self.read_ini.get_sheet_name()]

    # 声明一个方法获得指定单元格的value
    def get_cell_value(self, row, column):
        # 通过ws对象的列行坐标找到对应的单元格 然后通过cell对象的,value属性获取指定单元格的值
        return self.ws[column + str(row)].value

    # 声明一个方法获得用例编号
    def get_case_id(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        # p#rint(type(ProjectConstant.CASE_ID))
        return self.get_cell_value(row, ProjectConstant.CASE_ID)

    # 声明一个方法获得用例标题
    def get_case_name(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.CASE_NAME)

    # 声明一个方法获得用例的请求方法
    def get_case_method(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.REQUEST_METHOD)

    # 声明一个方法获得用例的请求的url
    def get_case_url(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.REQUEST_URL)

    # 声明一个方法获得用例请求的前置条件
    def get_case_precondition_id(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.PRECONDITION_ID)

    # 声明一个方法获得用例请求的依赖字段
    def get_case_depend_field(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.DEPEND_FIELD)

    # 声明一个方法获得用例执行需要的正则表达式
    def get_case_regular_expression(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.REGULAR_EXPRESSION)

    # 声明一个方法或的用例执行需要的参数的key
    def get_case_parameters_key(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.REQUEST_PARAMETERS)

    # 声明一个方法或的用例执行的预期结果的key
    def get_case_expected_outcome_key(self, row):
        # 通过ProjectConstant类的属性获得对应的常量值
        return self.get_cell_value(row, ProjectConstant.EXPECTED_OUTCOME)

    # 声明一个方法获得用例执行需要参数的值
    def get_case_parameters_value(self, row):
        # 通过read_json方法获得指定json文件,然后根据key获得请求所需参数的值
        if self.get_case_parameters_key(row):
            return read_json(
                self.params_data_path)[self.get_case_parameters_key(row)]

    # 声明一个方法获得用例执行的期望结果的值
    def get_case_expected_outcome_value(self, row):
        # 通过read_json方法获得指定json文件,然后根据key获得期望结果的value
        if self.get_case_expected_outcome_key(row):
            return read_json(self.exception_data_path)[
                self.get_case_expected_outcome_key(row)]

    # 声明一个方法获得用例执行的响应数据类型
    def get_case_response_data_type(self, row):
        # print(self.get_cell_value(row,ProjectConstant.RESPONSE_DATA_TYPE))
        return self.get_cell_value(row, ProjectConstant.RESPONSE_DATA_TYPE)

    # 声明一个方法 获得用例是否执行参数
    def get_case_if_execute(self, row):
        return self.get_cell_value(row, ProjectConstant.CASE_IF_EXECUTE)

    # 声明一个方法获取excel的行数
    def get_row_count(self):
        # 通过work_sheet对象的max_row属性 获得行数
        return self.ws.max_row

    # 声明一个方法获取excel的列数
    def get_column_count(self):
        # 通过work_sheet对象的max_column属性 获得列数
        return self.ws.max_column
Exemplo n.º 12
0
class useadd_test(unittest.TestCase):
    # succeed_add_user_data = read_excel_data(
    #     r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\useradd_data.xlsx', 'useadd_success')
    # failed_add_user_data = read_excel_data(
    #     r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\useradd_data.xlsx', 'useadd_failed')
    # 获得用户添加的yaml文件
    useadd_yaml_data = read_yaml_data(ReadIni().get_yaml_path())
    # 实例化logging类,获得日志生成路径 日志名为当前用例执行时间
    ttt = time.strftime('%Y-%m-%d-%H-%M-%S')
    current_test = 'useadd'
    current_logging = get_logging(
        ReadIni().get_logging_path() +
        'logging-{}-{}.log'.format(current_test, ttt))

    @classmethod
    def setUpClass(self):
        # 登录动作 实例化类
        self.useadd_test = Useradd_page('Chrome')

    def setUp(self):

        self.useadd_test.login('admin', '123456')

    # def tearDown(self):
    #     self.useadd_test.chick_out_useadd()

    def tearDownClass(self):
        self.useadd_test.quit()

    # @parameterized.expand(succeed_add_user_data)
    # 参数化数据格式化
    # @parameterized.expand([('jakiro', '邱杰', '123456', '123456', '@qq.com', 'Jakiro')])
    # 通过yaml_data进行数据驱动
    @parameterized.expand(useadd_yaml_data['useadd_success'])
    def test_useadd_succeed(self, username, realname, password,
                            confirm_password, email, expectation, case_number,
                            current_test_module):
        '''

        :param username: 用户名称
        :param realname: 用户真实姓名
        :param password: 用户密码
        :param confirm_password:再次确认密码
        :param email: 用户邮箱
        :param expectation: 期望用户名
        :return:
        '''
        try:
            # 添加成功动作
            self.useadd_test.useradd(username, realname, password,
                                     confirm_password, email)
            # 断言动作 获取最后一个数据的用户姓名文本
            actual_text = self.useadd_test.get_user_text()
            # 断言 实际用户姓名文本与输出用户姓名文本对比
            self.assertEqual(expectation, actual_text, '实际用户姓名与期望用户姓名不一致')
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.useadd_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—{}-{}-{}.png".format(current_test_module,
                                                 case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))

    # 通过yaml文件进行数据驱动 key值为useadd_failed
    @parameterized.expand(useadd_yaml_data['useadd_failed'])
    def test_useadd_failed(self, username, realname, password,
                           confirm_password, email, expectation,
                           prompt_selector, case_number, current_test_module):

        try:
            # 添加失败动作
            self.useadd_test.useradd(username, realname, password,
                                     confirm_password, email)
            # 断言动作 获取弹出的提示窗的文本
            actual_prompt_text = self.useadd_test.get_text(prompt_selector,
                                                           wait=30)
            # 断言 实际提示窗文本与期望文本对比
            self.assertTrue(expectation == actual_prompt_text,
                            '实际提示窗文本与期望文本不相等')
        except:
            tt = time.strftime('%Y-%m-%d-%H:%M:%S')
            self.useadd_test.get_screenshot_as_file(
                ReadIni().get_screen_shot_path() +
                "screenshot—-{}-{}-{}.png".format(current_test_module,
                                                  case_number, tt))
            # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志
            self.current_logging.error("{}第{}用例出现错误,请排查".format(
                current_test_module, case_number))
            raise AssertionError('{}第{}条用例出错了快去查看'.format(
                current_test_module, case_number))
        finally:
            self.useadd_test.chick_out_useadd()
Exemplo n.º 13
0
        if type(sheets) == str:
            sheet_seq = [sheets]
        elif type(sheets) == list or type(sheets) == tuple:
            if sheets:
                sheet_seq = sheets
            else:
                sheet_seq = excel_data.sheetnames
        else:
            raise TypeError("输入的sheets不是可迭代对象,请输入字符串或列表或元组")
        for sheet in sheet_seq:
            get_sheet = excel_data[sheet]
            row_list = []
            header_filter = True
            for row_tuple in get_sheet:
                if header_filter:
                    header_filter = False
                    continue
                row_list.append([str(cell.value) for cell in row_tuple])
            # json_dict[sheet+'1'] = row_list
            json_dict[sheet] = row_list
        dict_to_json(json_path, json_dict)
    else:
        with open(json_path, mode='w', encoding='utf8') as fi:
            pass
        excel_to_json(excel_path, json_path)


if __name__ == '__main__':
    json_path = 'testcase_data.json'
    excel_to_json(ReadIni().case_excel_abspath(), json_path)
Exemplo n.º 14
0
# coding=utf-8
# @Time    : 2019/9/6 14:38
# @Author  : Mandy
import os
import shutil
from datetime import datetime
import requests
import conftest
from common.read_ini import ReadIni

read = ReadIni(conftest.env_dir)
url = read.get_value('download_url', 'app')
filename = os.path.basename(url)
filename = filename.split('?')[0]
new_name = read.get_value('app_name', 'app')

apk_path = os.path.join(conftest.apk_dir, filename)

# def Schedule(a,b,c):
#     '''''
#     a:已经下载的数据块
#     b:数据块的大小
#     c:远程文件的大小
#    '''
#     per = 100.0 * a * b / c
#     if per > 100:
#         per = 100
#     print('%.2f%%' % per)
# def run():
#     # local = url.split('/')[-1]
#     local = os.path.join('/testapp', 'Python-2.7.5.tar.bz2')