先来说说继承,假使你需要写一个类来实现某些功能,而其中实现的方法,恰恰是别人的类已经实现了的方法,
这个时候我们需要直接把它拿过来用,该怎么做呢?面向对象里的继承就是父类的相关属性和方法,
可以被子类继承重复使用,子类不必再在自己的类里面重新定义,而对于自己类里面需要用到的新的属性和方法,
子类需要自己扩展。
继承最大的好处既子类可以获取父类的所有功能。
通过继承可以最大限度的将通用的功能放入基类中减少代码的维护成本。
super 用于继承父类的方法、属性。
super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。
使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。
多继承,如果有多个父类存在相同的方法或者变量,那么只继承第一个父类的
再来说说多态,多态包含了重载和重写:多态以 继承 和 重写 父类方法 为前提
同一个方法在不同的类中最终呈现出不同的效果,即为多态!这句话怎么理解?
假设A为基类、B继承A、C也继承A,且ABC都有同一个方法名,那么在创建对象调用的时候,每个方法实现的功能或者叫职能不同的状态,可以称之为多态,
也可以理解成BC继承了A,并且重写了同一个方法实现不同的功能,
亦可如此举例:两个类不存在继承关系,但是拥有同一个方法名,那么该方法实现的效果不尽一样,
那么这也是多态<但是并不是重写>。重点在于相同的方法实现不一样的功能。
重写<必须存在继承>:子类继承了父类<基类>,当父类的方法不满足现有需求时,在子类中定义与父类同名的方法,
进行重写覆盖父类的方法,在创建子类的对象调用该方法时,而是子类的方法;
假设方法名不一样,就无法覆盖,从而是两个不同类的不同方法。所以区分是否重写父类方法的标准是调用该方法申明的类对象来决定。
重载:这个就好理解了,跟继承无关<可以在继承中实现>,那么同名不同参即为重载,
再同类中实现,如果是继承的话,即为重写!
所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。
1)区别:
① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。
② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
③ 调度和切换:线程上下文切换比进程上下文切换要快得多。
④ 在多线程操作系统中,进程不是一个可执行的实体。
2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。
进程是资源分配的单位
线程是操作系统调度的单位
进程切换需要的资源很最大,效率很低
线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
协程切换任务资源很小,效率高
多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
UI自动化框架主要的核心框架就是分层+PO模式:
基础封装层BasePage
PO页面对象层
TestCase测试用例层
日志处理模块、ini配置文件读取模块
unittest+ddt/pytest数据驱动模块,jenkins持续集成模式组成。
HTMLTestRunner、allure测试报告模块
接口自动化框架大都与UI自动化框架分层一致:
封装requests请求类,实现http常用的请求方法及入参数据格式处理:post、get、表单或json数据
TestCase测试用例层
日志处理模块、数据库读取模块、配置文件读取模块、Excel文件读取模块
unittest+ddt/pytest数据驱动模块,jenkins持续集成模式组成
HTMLTestRunner、BeautifulReport等测试报告模块
PO是Page Object 模式的简称,即页面对象设计模式,它是一种设计思想,意思是,把一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,
PO模式一般使用三层架构,分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。
先从几个方面入手对比:
用例设计方面:
unittest
测试类必须继承unittest.TestCase
测试函数必须以“test_”开头
使用defaultTestLoader.descover()加载测试用例时,测试模块( py文件)名称要以test开头
pytest
测试模块文件的文件名必须以"test_ “开头或者以” _test"结尾
测试类命名必须以"Test"开头
测试函数名必须以"test"开头
测试类里面不能使用" init "方法
断言,unittest框架的assert相关方法,pytest是assert关键字+表达式
用例前后置处理:unittest有setup、teardown每个用例前后执行一次,类方法:setupclass、teardownclass每个测试类前后执行一次
pytest通过fixture设置不同作用域:session整个测试执行前后一次、module只对模块生效及py测试文件、class只对类级别生效、function默认级别对测试用例方法生效;
参数化的对比:unittest结合ddt模块,在测试类上面使用@ddt装饰,测试用例的方法上使用@data()来实现数据驱动
pytest通过装饰器@pytest.mark.parametrize来实现数据驱动
生成报告的方式:unittest通过htmltestrunner、BeautifulReport
pytest通过pytest-html生成html格式报告,也可以与allure集成优美的allure测试报告
pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:
简单灵活,容易上手,支持参数化
能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、
接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,
比较好用的如:
- pytest-selenium(集成selenium)、
- pytest-html(完美html测试报告生成)、
- pytest-rerunfailures(失败case重复执行)、
- pytest-xdist(多CPU分发)等
测试用例的skip和xfail处理
可以很好的和jenkins集成
report框架----allure 也支持了pytest
普通实例方法:
- 第一个参数必须要默认传实例对象self,它表示一个具体的实例本身;实例方法只能被实例对象调用;
staticmethod静态方法
- 那么就可以无视这个self,而将这个方法当成一个普通的函数使用,可以被类或类的实例对象调用;参数没有要求。
classmethod类方法
- 它的第一个参数不是self,是cls,它表示这个类本身;可以被类或类的实例对象调用;第一个参数必须要默认传类,一般习惯用cls。
解决方案有多种,这里简单介绍常用的两种,以用户登录-后面接口请求数据为例;
分析:后面的接口请求数据需要获取用户的登录态token,鉴权正确后才能正常访问数据;
方案一:将该登录接口放在接口测试用例excel第一个请求的行,会在测试用例脚本中优先处理,并将token提取并保存,以供后面所有接口需要鉴权时使用,让用户可以正常请求;
方案二:将该登录接口放在脚本中,使用框架中自带的前置处理函数,请求并提取token保存于变量中,以供后面的接口进行请求;
那么token信息如何保存呢?
一是保存文件,在读取使用<显然这个操作有点废轱辘>,二是设置为全局变量,三是设置为类属性<推荐使用这种方式,方便灵活利于参数替换>
在本人直观使用体验来区分:
jmeter免费开源,社区活跃,是一个非常强大的性能测试工具,如果说之前它的结果报表不足以媲美loadrunner,
那么现在丝毫不逊色,各种插件及监控框架应运而生,完全弥补了这一不足。
Loadrunner大型商用工具,初学者的摇篮,其功不可没,一开始强大的录制功能,更是为所有初学者提供了便利,
各大组件各司其职,尤其强大的分析数据报表能力无人能出其右。个人钟爱!
至于locusts,首先要有一定的代码基础,虽然可以拿着模版一阵捣鼓,最终却不能更好的发挥利用,
那么这也是浪费,再有其不出色的测试结果报告,也很难被广泛使用,高手例外!
至于其中性能测试所关注的指标,如:TPS、平均响应时间、并发用户数,这类概念在网络博客中已经糜烂,
看过之后的理解也就只能到理解这一步,却不知其会受到哪些因素的影响而发生改变。
TPS:翻译过来就是每秒通过事务数,随着并发用户的递增,tps也该随之增长,如果出现拐点就需要分析具体缘由了。
avg:平均响应时间,在很多时候作用不大,倒不如其他90/95/99这些响应时间更实际,但是它却可以作为分析性能结果的参考。
并发用户数:区别于用户总数、在线用户数,它指用户在同一时间发起的行为的用户的数量。
这个问题该怎么回答?仁者见仁智者见智!!!
@pytest.fixture装饰器定义一个函数,可以在pytest框架中被调用,其中默认scope的作用域是function,其它还有:session、module 、class;
如果想整个框架的测试用例执行只启动一次app就采用session级别的,如果是指定那些模块的测试用例执行则使用module、单个测试类就是class、function默认是测试用例方法级别
首先selenium提供了save_screenshot_as_file等截图保存的方法,我们二次封装时设置好保存路径、命名规则并且结合allure增加到allure报告中展示,
再是二次封装的查找页面元素的方法,try…except处理异常模块中进行调用,当没有找到该元素时进行截图保存即可。
这可能需要使用到多线程并发处理,或者selenium gird分布式执行测试,需要深入了解到它的原理。
微服务的优势:我没有微服务开发经验,但是工作中难免会接触到这类微服务架构,实际中感触,它很轻量、服务拆分利于快速跟踪反馈问题<隔离性>,同时开发的学习成本也相应降低。
http通讯、RPC(Thrift, Dubbo)、消息通讯
这个问题有点难度!!!
第一要明白,装饰器本身就是一个函数,不说的花里胡哨,再者需要明白嵌套函数以及参数的使用。
(1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。
(2)数据结构和算法不同。字典是hash算法,搜索的速度特别快。
(3)占用的内存不同。
留给各位看官来解答一下!!!