1.python列表、切片

2.python序列化和反序列化

TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

Python中在对象持久化或者跨进程同步对象的时候不可避免的需要时候借助于序列化和反序列化。

模块名称描述提供的api
json用于实现Python数据类型与通用(json)字符串之间的转换dumps()、dump()、loads()、load()
pickle用于实现Python数据类型与Python特定二进制格式之间的转换dumps()、dump()、loads()、load()
shelve专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷open()

Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。

  • encoding: 把Python对象转换成JSON字符串
  • decoding: 把JSON字符串转换成python对象

(22条消息) python 序列化和反序列化_大咖爱爬虫的博客-CSDN博客_python序列化和反序列化

Python序列化和反序列化 - 简书 (jianshu.com)

(22条消息) python中dump 和dumps load和loads的区别_xgh1951的博客-CSDN博客_dumps

3.python字典的处理,获取value

可以通过字典中的keys获取对应的value

也可以通过values函数获取该字典中的所有value

4.自动化工程base里的init是怎么定义的,用代码描述

class BasePage(object):
    """
    定义一个页面基类,让所有页面都继承这个类,封装一些常用的页面操作方法到这个类
    """

    def __init__(self, driver):
        self.driver = driver

    # 退出浏览器
    def quit_f(self):
        self.driver.quit()
        logger.info("****** Quit browser ******.")
        # logger.info("============ END ============")

    # 关闭当前window
    def close_f(self):
        try:
            self.driver.close()
            logger.info("Close window or browser.")
        except NameError as e:
            logger.error("Failed to close window or browser! {}".format(e))

    def clear_cookies_f(self):
        self.driver.delete_all_cookies()
        logger.info("Clear cookies.")

    # 刷新浏览器
    def refresh_f(self):
        self.driver.refresh()
        self.wait_sleep_f(3)
        logger.info("Sleep for browser refresh.")

    # 浏览器前进操作
    def forward_f(self):
        self.driver.forward()
        logger.info("Browser forward.")

5.自动化工程报告testsuite的discover里参数配置

suites = unittest.defaultTestLoader.discover(path_test_cases, pattern='test_*.py')

discover(start_dir, pattern ='test *.py', top_level_dir = None )

start_dir:要测试的模块名或测试用例目录;

pattern='test*.py':表示用例文件名的匹配原则,下面的例子中匹配文件名为以“test”开头的“.py”文件,星号“*”表示任意多个字符;

top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None;

该方法通过从指定的开始目录递归到子目录中查找所有测试模块,并返回包含它们的TestSuite对象,只有与模式匹配测试文件和可导入的模块名称才会被加载。

所有测试模块必须可以从项目的顶层导入,如果起始目录不是顶层目录,则顶层目录必须单独指定。

如果一个测试文件的名称符合pattern,将检查该文件是否包含 load_tests() 函数,如果 load_tests() 函数存在,则由该函数负责加载本文件中的测试用例。

如果不存在,就会执行loadTestsFromModule(),查找该文件中派生自TestCase 的类包含的 test 开头的方法。

6.ddt是怎么工作的

在整个测试类上面添加@ddt的装饰器,通过数据来驱动测试类的执行

实际上ddt有两个方法装饰器,分别是@date @file_date

@date 装饰,即由 ddt 直接提供数据

@file_data 装饰,即数据由外部文件提供

在对应的def(函数)上部引用修饰器@data(在yaml里准备的测试数据list)

image.png

image.png

Python @ddt.file_data() 为.yml 文件实例 - 安柠筱洁 - 博客园 (cnblogs.com)

7.yaml是怎么读取的,用代码描述

class HandleYaml:
    def __init__(self, file_name=None):
        if file_name:
            self.file_path = os.path.join(path_project, "test_datas", file_name)  #拼接yaml所在路径
            print(self.file_path)

    def get_data(self):
        if os.path.exists(self.file_path):       #判断文件是否存在
            with open(self.file_path) as fp:     #打开路径下的yaml
                data = yaml.safe_load(fp)        #加载yaml文件
                return data                      #返回数据
        else:
            return None
get_data = HandleYaml('test_datas_23_get_users.yaml')  # 从yaml文件中取出该接口的参数
pageList = get_data.get_data()['pageList']             # 定义yaml中的['pageList']为pageList 
userNameList = get_data.get_data()['userNameList']
    @data(*pageList)                                   #加载*pageList,驱动测试
    def test_01_get_users_pages(self, keywords):   
        pages = keywords.get('pages')                  # 通过keywords.get方法取出*pageList的pages的value
        result_code = keywords.get('result_code')

8.jmeter用到什么程度

9.学习的途径(希望你读源码,看官方文档)

10.python装饰器

(21条消息) 简单了解Python装饰器实现原理_小江江的成长之路-CSDN博客_python 装饰器原理