实训一学习总结

第一天内容、测试的理论知识:

1.软件开发的生命周期;

a.客户提出需求(概念)
b.根据客户的需求写出相对的<<需求文档>> 
c.前端设计效果图(原型图) 
	  后台开发人员设计与编写代码实现功能
	  测试人员也会根据需求文档编写测试计划和测试用例
d.在后台开发实现功能后根据测试用例测试人员进行测试。
e.开发完全结束后测试人员进行整体测试,全面测试。测试成功后进入上线
f.软件上线后根据用户体验和实际效果进行小版本的迭代。

2.软件缺陷生产的原因种类;

1.需求变更次数频繁  理解误差   产品或者是客户
2.开发和设计 代码问题		  开发人员
3.运维  资源使用率产生		  公司问题

3.测试的流程;

1.在立项会上根据客户需求编写需求文档/规格说明书,ui设计原型图后台编码,测试人员编写测试计划和测试用例
2.随着开发的代码实现测试进行测试评审
3.主要代码实现后测试人员先进行冒烟测试
4.代码实现后测试执行测试用例
5.根据执行的结果进行对应bug提交给相对应的开发人员让其修改代码
6.开发修改后测试人员进行回归测试
7.直至项目上线后 测试人员编写测试总结用于下一个版本的迭代
 **冒烟测试:  在这个软件中主要的功能实现后进行测试
 **回归测试:  在开发人员修改后进行的同一个问题的测试

4.软件测试的分类;

1.按阶段划分:
   a.单元测试    对一个模块测试   
   b.集成测试    对多个模块测试(有一定的关联)
   c.系统测试    在软件编译后执行的整体测试
   d.验收测试    对软件执行后的用户体验的测试  
		α 阿尔法测试   有一定的开发测试人员的测试   内测  
		β 贝塔测试     只有用户参与的测试           公测
   
2.按是否运行程序划分;
    a.静态测试     UI设计图  
	b.动态测试     有执行代码过程中产生的问题
	
3.是否查看源代码方式划分;
   a.黑盒测试    不看源代码结构 只关心外观和能否输入输出以及响应时间
		功能测试		 界面 安装 兼容 易用 
		性能测试	     压力测试  负载测试  一般性能 稳定性测试
			压力测试   在同一时间内进行多个用户的访问
			负载测试   在多个用户在一段时间的持续访问
	
   b.白盒测试     只看代码结构以及代码实现方式
   c.灰盒测试     介于黑盒和白盒之间一种

5.软件测试的原则;

1.尽早原则
2.考虑意外情况和极端情况发生
3.群集现象
4.测出问题能够复现问题
5.回归测试的关联性 
6.善于总结相关文档 

6.软件测试常用开发模式;

V型
WW型
H型
螺旋型

7.公司的组织架构;

一般在公司内部有的部门:  人事  财务  开发(前端 后台  移动端 测试)  市场(产品)  运维(产品维护的
服务) 开发,测试   1个测试对应5个开发 1个前端 3个后台 1个移动端
	ceo	   首席执行官
	CTO    首席技术执行官
	CFO	   首席财务执行官
	COO	   首席运营执行官
	
	UI		用户界面
	ANDROID		Android工程师
	IOS		开发工程师
	QA 		测试
	TS  		技术支援
	DBA		数据库管理员
	UE		用户体验师
	RD		研发工程师
	
	总监
	项目经理:pm
		组长:    
		组员:
	产品经理:hpm

8.测试工具;

World文档   测试计划  测试用例 缺陷报告
接口工具    charles Fiddler   postman
性能工具    Jmeter Loadrunner
bug管理工具 禅道 QTP 
自动化管理工具  selenium  appnium  untest  pytest  
云测工具  Testing

第二天内容、测试用例:

1、测试用例定义

执行测试的依据,将测试的操作步骤进行以文档的方式记录下来

2、测试用例的格式

测试用例模块	测试用例的编号   测试输入  执行条件  预期结果  实际结果 
测试用例的模块   操作软件的一个大的菜单   命名以模块名称为主
测试用例的编号   命名以菜单下具体功能——数字   
测试输入    	   对具体的功能操作步骤   
执行条件         操作的先决条件
预期结果         是以需求文档上的内容为准
实际结果  	   依据测试数据的内容输出后得到的结果可能与预期一直或是不一致
测试用例的文档方式2种  exl 表格的方式  word文档方式

3、测试用例的特性

代表性:能够代表并覆盖各种合理的和不合理、合法的和不合法的、边界的和越界的以及极限的输入数据、操作等。
针对性:对程序中的可能存在的错误有针对性地测试
可判定性:测试执行结果的正确性是可判定的,每一个测试用例都应有相应的期望结果
可重现性:对同样的测试用例,系统的执行结果应当是相同的。

4、软件的分类

 OA   办公自动化  
 crm  客户管理系统
	  电商项目
 ERP  进销存系统

5、 测试方法/测试策略

1.等价类划分
2.边界值
3.因果图法
4.正交法
5.场景法
6.错误推断法

测试用例的输入类型:  字母  数字  特殊符号 空字符  汉字

6、 编写任意测试用例的时候3步骤走:

1.根据需求提取测试用例的测试点
2.根据测试点内容输入不同数据类型
3.得到不用结果用来编写测试用例

第三天学习内容、禅道的安装及使用

1、禅道简介

	禅道由青岛易软天创网络科技有限公司开发,国产开源项目管理软件。它集产品管理、项目管理、质量管理、
文档管理、组织管理和事务管理于一体,是一款专业的研发项目管理软件,完整覆盖了研发项目管理的核心流程。
禅道
官方网站:http://www.zentao.net/
官网使用步骤详解:http://www.zentao.net/book/zentaopmshelp/38.html

2、禅道项目管理系统的特点

第一款完整涵盖产品管理、任务管理、测试管理的开源管理软件,使用一个软件解决项目管理核心问题。
基于国际流行的敏捷管理方式scrum。
B/S Broswer/Server C/S Client/Server 架构,方便部署、使用。
概念简单,容易上手。
开源的项目管理软件,可自由进行定制,修改。
免费的项目管理软件,降低企业的投入成本。
自主的开发框架,预留扩展机制,通过第三方的插件扩展获得更多的功能。

3、禅道系统的功能列表

1. 产品管理:包括产品、需求、计划、发布、路线图等功能。
2. 项目管理:包括项目、任务、团队、版本、燃尽图等功能。
3. 质量管理:包括bug、测试用例、测试任务、测试结果等功能。
4. 文档管理:包括产品文档库、项目文档库、自定义文档库等功能。
5. 事务管理:包括todo管理,我的任务、我的Bug、我的需求、我的项目等个人事务管理功能。
6.  组织管理:包括部门、用户、分组、权限等功能。
7.  统计功能:丰富的统计表。
8.  搜索功能:强大的搜索,帮助您找到相应的数据。
9.  扩展机制,几乎可以对禅道的任何地方进行扩展。
10. api机制,所见皆API,方便与其他系统集成。

4、用户角色

实训一学习总结_第1张图片

	禅道管理软件中,核心的三种角色:产品经理、研发团队和测试团队,这三者之间通过需求进行协作,实现了
	研发管理中的三权分立。其中产品经理整理需求,研发团队实现任务,测试团队则保障质量,其三者的关系
	如下图: 

实训一学习总结_第2张图片

5、禅道的安装

1、双击文件,安装(解压)

实训一学习总结_第3张图片

2、查看目录

实训一学习总结_第4张图片

实训一学习总结_第5张图片

实训一学习总结_第6张图片

点击服务:apche可以选择80或88端口,mysql可以选择3306或3308端口
点击访问禅道,页面会自动跳转到禅道的页面。
也可以直接访问http://localhost/zentao/ 管理用户:admin,密码 123456 
备注:如果你启动的是88端口,请使用http://localhost:88/zentao来访问。

实训一学习总结_第7张图片

3、登录

实训一学习总结_第8张图片

4、登录成功

实训一学习总结_第9张图片

6、禅道操作

1、禅道的使用
1.人员管理  2.权限分配  3.产品控制  4.项目控制   5.编写用例  6.提交缺陷(bug)
6.1.1人员管理
1.1.1.添加部门

实训一学习总结_第10张图片

1.1.2.添加用户

实训一学习总结_第11张图片
实训一学习总结_第12张图片

1.1.3.添加成功展示效果

实训一学习总结_第13张图片

7、使用流程

1、创建产品

在禅道中,产品是一切的核心,所有的东西基本上都是围绕产品展开。那么如何创建第一个产品呢?
1.产品经理登录禅道。 
2.进入产品视图。 
3.在页面右侧,有“新增产品”选项。 

实训一学习总结_第14张图片

4.点击【新增产品】,出现产品创建的页面。

实训一学习总结_第15张图片

5.在这个页面中,产品名称和产品代号是必填的。比如,我们创建一个“测试产品”,代号为test。点击保存。

6.添加模块

实训一学习总结_第16张图片

7.2.添加需求

添加了产品之后,需要创建一个需求。
所谓需求,就是来描述一件事情,如模板:作为一名<某种类型的用户>,我希望<达成某些目的>,这样可以<开发的
价值>。这样的需求,有用户角色,有行为,也有目的和价值所在,非常方便与团队成员进行沟通。
创建需求的步骤如下:
1.产品经理登录禅道。 
2.进入产品视图。 
3.在页面右侧,有“新增需求”菜单,点击菜单,出现新增需求的页面。

在这里插入图片描述

4.需求的创建页面,预计工时和需求名称都为必填项。预计工时,也就是你估计完成这个需求大约多少个小时。

实训一学习总结_第17张图片

注意:由谁评审,选择不需要评审,这样新创建的需求状态是激活状态。只有激活状态的需求才能关联到项目中,
进行开发。

在这里插入图片描述

7.3.创建项目

创建了产品和需求以后,需要创建一个项目,来完成这个需求。在实际的情况中,肯定会有多个需求。那么如何确定
一个项目中该做哪些需求呢?应该对需求进行优先级的排列,并根据项目的周期和参与的人手来决定。
创建项目的步骤:
1.项目经理登录禅道。 PM

实训一学习总结_第18张图片

2.进入项目视图
3.在页面的右侧,有“新增项目”按钮。 
4.点击此按钮,进入新增项目页面。
5.项目名称、项目代号、起止日期和团队名称为必填项。 
访问控制选择“私有项目”。

实训一学习总结_第19张图片

创建了项目之后,要确定其团队成员。在禅道里面,是通过“团队成员”管理来完成的。

实训一学习总结_第20张图片

1.进入项目视图之后,点击【设置团队】,出现团队的成员列表。 
2.点击下面的团队管理,即可维护团队的成员。
注意:成员在该项目中预计投入的时间。不能按照项目中的成员,每天都是8小时全勤投入来计算。

实训一学习总结_第21张图片

7.4.关联需求

项目创建完之后,需要关联要做的需求。
首先,需要关联产品。步骤如下: 
1.项目经理登录禅道。 
2.进入项目视图。

实训一学习总结_第22张图片

3.点击【关联产品】按钮。然后点选该项目相关的产品即可。
确定了产品之后,第二个操作就是关联需求。
1.项目经理登录禅道。 
2.进入项目视图。
3.点击【关联需求】,出现关联需求的界面。 在关联需求的时候,可以按照优先级进行排序。 (只有审批通过的需
求才能在“关联需求”中显示)

实训一学习总结_第23张图片
实训一学习总结_第24张图片

7.5.分解任务

需求确定之后,项目中几个关键的因素都有了。确定的时间,确定的人手,确定的事情,那么接下来就是如何在规
定的时间里面,调用团队的成员积极性,完成这些事情。第一步,就是要分解任务。
分解任务的步骤:
1.项目经理进入项目视图。 
2.进入需求列表。 
3.选择某一个需求,点击【分解任务】。

实训一学习总结_第25张图片

分解任务的时候,注意确定任务的优先级,还有非常重要的就是任务的最初预计。 
当任务分解完后,团队成员领取自己的任务,开始具体的工作。然后每天更新自己所负责的任务,更新其预计时间。

实训一学习总结_第26张图片
实训一学习总结_第27张图片
实训一学习总结_第28张图片

7.6.Bug管理

1.提交Bug
提交Bug的步骤:
A.测试人员进入QA视图。
B.在页面右侧有“创建Bug”按钮。

实训一学习总结_第29张图片

C.点击【创建Bug】。
D.影响版本和Bug标题为必填项。

实训一学习总结_第30张图片
实训一学习总结_第31张图片
实训一学习总结_第32张图片

E:查看我所创建的bug

实训一学习总结_第33张图片

2.解决Bug
开发人员针对分配给自己的Bug去解决,解决Bug的步骤:
A.进入我的地盘或QA视图。
B.选择“我的Bug”或“缺陷管理”后,点击【解决】按钮。

实训一学习总结_第34张图片

C.填写解决方案,如“已解决”,选择解决版本,添加备注。

实训一学习总结_第35张图片
实训一学习总结_第36张图片
实训一学习总结_第37张图片
实训一学习总结_第38张图片

D.点击【保存】,显示Bug页面。
E.登录测试账号,查看bug

实训一学习总结_第39张图片
实训一学习总结_第40张图片

3.激活Bug
针对Bug状态为“已解决”的Bug,如果问题依然存在,则需要重新打开Bug。激活Bug的步骤:
A.进入我的地盘或QA视图。
B.选择“我的Bug”或“缺陷管理”后,点击Bug标题后进入QA视图的缺陷管理中的Bug页面。
C.直接点击【激活】按钮,添加备注。

实训一学习总结_第41张图片

D.点击【保存】,Bug的状态变为“激活”状态。
4.关闭Bug
针对Bug状态为“已解决”的Bug,如果此时问题不再存在,则此时测试人员需要关闭Bug。关闭Bug的步骤:
A.进入我的地盘或QA视图。
B.选择“我的Bug”或“缺陷管理”后,直接点击操作后的【关闭】按钮。
C.添加备注后,点击【保存】。我的地盘中的“我的Bug”中将不会存在状态为“关闭”的Bug。

7.7.创建发布

当某一期的项目结束后,如果这一期的版本可以对外发布,此时产品经理的一个职责就是创建一个发布。创建发布
的意义在于告知相关部门人员,有新产品上线,可以让相关人员继续开展工作。
创建发布的步骤:
1.产品经理进入产品视图,选择“发布列表”。 
2.点击【创建发布】,进入创建发布页面。
3.填写必填项:发布名称、Build和发布日期。
注意:发布的前提是要创建一个Build。

8.测试团队

8.1.Bug处理

实训一学习总结_第42张图片

生成bug列表

实训一学习总结_第43张图片

8.2.测试用例操作

实训一学习总结_第44张图片

8.2.3.修改用例

实训一学习总结_第45张图片

用例操作

实训一学习总结_第46张图片

8.2.4.执行测试用例

实训一学习总结_第47张图片

8.2.5.设置第三个测试用例执行失败

实训一学习总结_第48张图片

8.2.6.可以直接将执行失败的用例转成bug

实训一学习总结_第49张图片

第四天内容、MySQL数据库:

1、 什么是数据库?

		 Excle的数据的确很方便,但是对于企业来说就不一样了。一个公司里面可能有成千上万的Excel表格,
还在不同的电脑上,而他们的员工和客户需要实时看到企业给他们提供的所有数据,这种文件管理的方 法就很麻
烦,总不能每分钟都把一个新的巨大无比的Excel文件发给所有客户呀。
	   
	   	 数据库呢,就是存储数据的地方,就像冰箱是存储食物的地方一样。正是因为有了数据库后,所有人可
以直接在这个系统上查找数据和修改数据。例如你每天使用余额宝查看自己的账户收益,就是从后
台数据库读取数据后给你的。
	   		
         数据库的英文名称叫DB(Database),那么数据库里面有什么东东呢?
	   
	     其实,数据库通常包含一个或多个表组成。如果你用过Excel,就会知道Excel是一张一张的二维表。
每个表都是由列和行组成的,其中每一列都用名字来标识出来。同样的,数据库里存放的也是一张一张的表,只不
过各个表之间是有联系的。所以,简单来说:
	   
	     数据库=多张表+各表之间的关系
	   
	     其实数据库是逻辑上的概念,它是一堆互相关联的数据,放在物理实体上,是一堆写在磁盘上的文件,
文件中有数据。这些最基础的数据组成了表(table)。
	   
	     常用的数据库软件,例如MySQL、Oracle、SQL
Server等都是实现上面理论的数据库。各个数据库软件的使用差别大同小异,但是因为MySQL是开源的,
成为各大公司使用的主流,面试也主要以MySQL为主。
	   
	     数据库是按照数据的结构来组织,存储,和管理数据的仓库,简而言之,就是存放数据的仓库

2、数据库和SQL是什么关系?

		 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种
		 特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据
 库系统;同时也是数据库脚本文件的扩展名。

		 数据库里面放着数据,而SQL是用来操作数据库里数据的语言(工具)。

        例如有一碗米饭(碗就是mysql,里面放的米是数据),你要吃碗里的米饭,拿什么吃?拿筷子(sql)。
用筷子(sql)操作碗里(mysql)的米饭(数据)

3、数据库有哪些?

		Oracle是最挣钱的数据库,出自甲骨文公司,市场占有率非常高,功能非常强大,被一些大型企业,
			电信,银行,证券公司所使用

		MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
 MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational 
 Database Management System,关系数据库管理系统) 应用软件。MySQL目前最流行的开源数据库,被甲骨文公
 司所占用,威胁着老大Oracle的地位,开源,免费,支持多平台,易用

		SQLServer,微软开发的数据库,仅支持Windows操作系统,号称是windows上最好用的数据库。数
据库的天下不仅仅是MySQL和Oracle的,SQLServer也正在慢慢崛起,微软网罗了不少数据库的专家,推出了不少重
磅功能。

		MongoDB,最好用的文档型数据库,是NOSQL类型数据库的领导者之一,也是当前最成功的NoSQL
类型数据库,数据存储格式采用JSON形式,非常灵活。

		Redis,最好的内存级数据库,查询效率极高,并且在Redis 3.0之后,支持多种数据类型,String,
Set,List,Hash等类型,开始支持集群,弥补了自身短板。是目前做缓存最流行的数据库

		Neo4J,最好的图形化数据库,流行话较低,但是图形化数据库的绝对领导者。

		SQLite,最流行的嵌入式数据库,占领手机行业的绝对领导者地位,Android和IOS两大手机系统,
‘’都内嵌了SQLite数据库,SQLite是一个完整的关系型数据库,支持标准SQL,支持事务操作,程序包非常小,
是嵌入式设备的最佳选择。

4、Navicat 的使用:

		Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本
而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,
让你可以以安全并且简单的方式创建、组织、访问并共用信息。

5、.mysql的基本知识及使用:

update:修改
set:设置
where:条件
insert into:必须在一块  插入
values:值
ALTER:修改表的字段
字段为:表的每一列
desc:语法  查看表结构
select:查询
*:所有
ORDER BY:排序
DESC:降序
ASC:升序

第五天内容、移动端测试:

☆重点: app测试的内容 add命令 monkey命令

次重点: 模拟器的安装(雷电 夜神 android的自带的模拟器使用)

常规测试 、 真机测试

了解:市场有的移动端的操作系统有?
	1.android 
	2.IOS
	3.微软
	4.塞班
	5.华为(未在市场)
	
测试范围就是移动端的软件  公司内部一般选择的是真机测试/云测试
如果应用程序在安卓上进行测试   bug的数量居多
如果应用程序在ios上测试        bug的数量少很多

移动端的测试内容有:

1.应用程序的功能测试

    测试的时间: 移动端的开发结束后   
	测试的依据:  需求文档和ui设计效果图
	测试的内容:    测试页面,测试程序的功能的实现

2.安装和卸载的测试

   应用程序安装后是否能够正常的运行 以及在安装的过程中是否有问题
   是否能够取消安装,取消后,安装未完成的文件是否清理
   卸载手机后文件是否删除所有对应的文件(log日志,历史记录 文件 安装目录)
   在不同的应用商店  小米市场 安卓市场 应用宝等

3.软件的升级测试

  是否拥有更新提醒,
  是否强制升级以及用户是否可以取消升级
  软件升级后是否重启手机,以及强制关机
 a:在升级的时候是否考虑手机电量的充足
   b:在升级的时候是否考虑下载升级包方式
  是否默认升级(不建议)

4.权限问题测试

 是否用户提醒和同意使用该权限
 6.0以后都是需要申请权限

5.消息推送机制

 a:是否在锁屏的情况下继续推送
 b: 推送是否用户同意 以及用户的使用习惯
 c:推送成功后,用户是否可以精准的打开链接

6.前后的切换的功能

 app在前后台一个正常切换,小窗口的模式
 双系统的切换
 当异常情况下考虑
 有数据交互的情况下

7.兼容性测试

8.网络测试

考虑到同一个运营商
	2G  3G 4G 5G weifi 弱网测试 无网络的时候
9.monkey测试压力测试

移动端的性能测试:

性能测试的指标
1、内存
2、CPU
3、流量
4、电量
5、启动速度
6、滑动速度、界面切换速度
7、与服务器交互的网络速度

第六天内容、Monkey命令:

Monkey 命令

1 通过使用程序模拟用户对移动端设备操作(单击 拖动 滑动 按键等)进行压力测试
2  可以使用Monkey命令进行检测多长时间内发生异常错误

3出现的方式:1.程序的访问量的多少
			 2.程序在一定时间内进行压力尝试一直程序的奔溃  异常  错误
			 
4.使用Monkey命令的方式  手动的方式在模拟器或者是真机操作
					    可以使用云测平台对于不同的手机不同的系统版本不同的测试
						
abd的使用是根据 adb.exe文件来进行使用
环境配置方式: a.找到abd.exe文件的绝对路径在地址栏中输入cmd的方式
			   b.可以使用配置环境变量方式  win+r 输入cmd的方式

monkey命令的启动

adb shell monkey + 命令参数 

1.对app进行多次访问的测试
	adb monkey  -p com.wan.android(包名\具体的页面) 100访问的测试
 2.显示日志的详细程度
    -v              包括 启动提示 测试完成 最终结果
    -v -v           标为详细的日志   发送到activity(页面的)的事件信息
    -v -v -v        最为详细的日志   测试中选中或者是没有选中的activity(信息)测试信息
    打印日志的命令
       adb shell monkey 200 >d:/monkeylog.txt
3.  --pct-touch    调整触摸事件的占比
4.  --throttle     用于用户对app的操作上的时间延迟  单位是毫秒   
				   如果没有时间的延迟 monkey会以最快的方式进行操作  发送请求
5.  --pct-motion   动作事件的占比  

6.  --ignore-crashes  如果app发生崩溃或者是异常的时候 monkey会停止执行
					  如果在abd 命令中有此命令参数  mongkey会继续执行直至事件计数完成
					  
	--ignore-timeouts (ANR) APP发生超时限制的时候  		  
					  如果在abd 命令中有此命令参数  mongkey会继续执行直至事件计数完成
	
0:  触摸事件的占比
1: 手势事件占比	
2: 两指操作占比
3: 动作事件(有一定轨迹)	
4: 屏幕旋转的占比
5: 导航事件 上下左右
6: 导航事件  home 回退  隐形菜单
7: 按键事件  关机键  音量添加 减少
8: 启动activity事件
9: 键盘抬起事件  
10: 其他事件

第七天内容、Charles安装、接口测试工具,抓包工具的使用:

1、课程内容:

软件开发的两种结构,http协议,http1.0与http1.1区别
http协议与url联系、常见方法,get与post区别
接口测试,接口测试工具的使用,抓包测试,抓包工具的使用

2、课程重点:

接口测试工具,抓包工具的使用,get与post的区别,http协议

3、课程难点:

接口测试的定义,接口测试与抓包工具的使用

4、软件开发的两种结构

BS与CS两种结构
BS结构:1.2.浏览器----服务器结构(调查派,微信)
CS结构:1.1.客户端----服务器结构。(王者荣耀,手机端微信)
区别:
CS响应速度快,安全性强,用户体验好,一般应用于局域网中,但是开发维护成本高,
BS可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。所以有些单位日常办公应用BS,在实际
生产中使用CS结构。

5、http协议内容

定义:超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。

6、http1.0与http1.1区别

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器
完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的
连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求
头和响应头(比如HTTP1.0没有host的字段).

7、Get与post请求的区别

1、GET使用URL或Cookie传参。而POST将数据放在BODY中。
2、GET的URL会有长度上的限制,2kb,则POST的数据则可以非常大。
3、POST比GET安全,因为数据在地址栏上不可见。
4、一般get请求用来获取数据,post请求用来发送数据。

8、会话跟踪技术cookie与session

客户端技术   Cookie
两个经典应用场合:判定注册用户是否已经登录网站,购物车。
服务端技术   Session
经典应用场合一般就是在Session中存储了用户的登录信息,进而可以访问一些需要权限才能访问的页面。

9、Session和Cookie的主要区别在于:

Cookie是把数据保存在浏览器端的内存中
Session把数据保存在服务器端的内存中
cookie与session的联系:
当服务器端生成一个session时就会向客户端发送一个cookie保存在客户端,这个cookie保存的是session的
sessionId。。这样才能保证客户端发起请求后客户端已经登录的用户能够与服务器端成千上万的session中准确
匹配到已经保存了该用户信息的session,同时也能够确保不同页面之间传值时的正确匹配。

10、常见状态码

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

11、什么是接口

接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点
来,通过一些特殊的规则也就是协议,来进行数据之间的交互。
一般我们用的多的是HTTP协议的接口、WebService协议的接口,还有RPC(Remote Procedure Call Protocol)
——远程过程调用协议的接口

不管是哪种接口,其本质就是发送一个request,然后服务器响应后返回一个response,然后我们对response进行
分析,这即是接口测试。

12、接口的分类:

1.webservice接口         
webService接口是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工
具才能进行调用,测试。
2.http api接口
http api接口是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是
json串,有get和post等方法,这也是最常用的两种请求方式。

13、安装了charles抓包工具

安装步骤如下:
1.安装权限证书

实训一学习总结_第50张图片

2.点击安装证书

实训一学习总结_第51张图片

3.选中第二项,证书存放为:受信任的根证书颁发机构

实训一学习总结_第52张图片

4.往浏览器里导入证书, 在此之前要在浏览器中下载证书,在地址栏中输入:chls.pro/ssl  下载证书

实训一学习总结_第53张图片

5.打开浏览器找到设置

实训一学习总结_第54张图片

6.在搜索框中输入管理 ,弹出以下这个页面,点击查看证书

实训一学习总结_第55张图片

7.将下载好的证书导入到浏览器中(当然为了查找证书的方便,我们提前将证书存放到桌面上了)

实训一学习总结_第56张图片

8.回到Charles找到代理设置

实训一学习总结_第57张图片

9.将IP地址和端口号改为“ * ”(注:这里的 “ * ” 代表的是所有的)  如果知道自己的IP地址,就在Host中输入
自己的IP地址,不知道的就输入 “ * ”  ,下面的端口号为:443  ,当然输入 “ * ” 也是可以的 

实训一学习总结_第58张图片

第八天内容、Charles弱网测试:

一、使用Charles进行弱网测试

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式
的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使得弱
网测试显得尤为重要。如果app没有对各种网络异常进行兼容处理,那么用户可能在日常生活中遇到APP闪退、ANR、
数据丢失等问题。因此,app网络测试,特别是弱网测试尤为重要。本文梳理了app网络测试要点和弱网测试常用模
拟方法,让大家对网络测试有一个全面的认识。

二、APP网络测试要点

1、各个网络下功能测试
不同网络下,检查基本功能点
运营商移动、联通、电信接入点测试(需要使用实际SIM卡)
若有智能DNS功能,还需要关注运营商判断/归类
高延时、高丢包、无网、假热点也可归入弱网测试范畴
2、网络切换测试
部分APP有智能DNS功能,网络切换涉及DNS切换。
网络切换检测机制:Android可以监听系统广播
3、弱网测试
用户体验和异常处理是各个网络场景都需要关注的,只是弱网场景下,需要重点关注。
弱网测试模拟
什么样的网络属于弱网
低于2G速率的时候都属于弱网,3G也可划分为弱网,一般Wi-Fi不划入弱网测试范畴。
4.如何进行弱网测试
1、SIM卡的网络切换
手机-设置-移动网络设置-网络类型选择
3G、4G卡都可以设置关闭3G/4G,只走2G网络。
2、具体弱网场景测试,常见场景包括:地铁/巴士、电梯、楼梯间、停车场
3、使用虚拟机模拟网络速度,如用树莓派搭建的弱网测试仪
4、使用软件进行网络代理,模拟不同的网络带宽、延时率、丢包率

三、弱网模拟常用工具

方法一:charles弱网模拟
配置参数解析:
bandwidth —— 带宽,即上行、下行数据传输速度
utilisation —— 带宽可用率,大部分modern是100%
round-trip latency —— 第一个请求的时延,单位是ms。
MTU —— 最大传输单元,即TCP包的最大size,可以更真实模拟TCP层,每次传输的分包情况。
Releability —— 指连接的可靠性。这里指的是10kb的可靠率。用于模拟网络不稳定。
Stability —— 连接稳定性,也会影响带宽可用性。用于模拟移动网络,移动网络连接一般不可靠。

具体网络设置参考:
Fiddler也可以进行弱网环境模拟,具体参考:Fiddler弱网模拟
方法二:chrome的webview调试工具弱网模拟
使用chrome的webview调试工具,缺点是只适用于web页面的弱网模拟。
具体步骤:
(1)应用打开webview调试功能,具体如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}
(2)手机链接电脑,运行APP,进入具体H5页面;
(3)chrome的DevTools中打开Webview:进入chrome://inspect/#devices,会显示已经连接设备,选中待调试
webview的inspectnetwork页面,No throttling下拉框,可以进行网络模拟。
方法三:iOS手机自带Network Link Conditioner 弱网模拟
iPhone手机打开开发者选项,具体参考:参考
设置-开发者选项 > Network Link Conditioner 入口。
系统已经内置常见网络配置,也可以增加自定义配置。
具体配置参数:
in Bandwidth 下行带宽,即下行网络速度
In packet loss 下行丢包率
in delay 下行延迟,单位ms
out bandwidth 上行带宽
out packet loss 上行丢包率
out delay 上行延迟
DNS delay DNS解析延迟
protocol 支持Any,IPV4、IPV6
interface 支持Any,WI-Fi,cellular(蜂窝网)
具体步骤参考:
网络测试经典问题分享

场景一:弱网下,页面加载过程,程序闪退。
原因:webview超时处理未在UI线程。toast、关闭页面等操作需要在UI线程。

场景二:302跳转页面,达到内置超时阀值后,webview自动关闭。
原因:业务有页面加载超时自动关闭的逻辑,超时机制未考虑302场景。

第九天内容、jmeter工具的使用:

课程内容:

性能测试概念,性能指标,
性能测试工具的使用:测试计划、线程组、HTTP请求、监听器,CSV文件,正则表达式,脚本录制
第三方插件使用,监控CPU、内存。。

1、性能测试概念

基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求
性能指标关注点:时间性能、空间性能

2、jmeter介绍

jmeter是一款性能测试工具
开源、免费、多平台使用

3、jmeter工具使用

3.1、线程组是什么
进程:	一个正在执行的程序对应一个进程	

线程:	一个进程有多个执行线程

线程组:	按照线程性质对线程分组

三者关系:	一个进程有多个线程组,一个线程组有多个线程

并发执行:多个线程同时执行,特点:执行结束的顺序与开始的顺序不一致

顺序执行:按照线程的启动顺序挨个执行

默认情况下,线程组中的线程是并发执行

每一个线程都要执行组内的http请求

设置线程组顺序执行:勾选测试计划中的(独立运行每个线程组)
	
1.2. 线程组主要包含三个参数:线程数、准备时长(Ramp-Up Period(in seconds))、循环次数。

1.3.  线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线
程数。

1.4.  准备时长(秒):设置的虚拟用户数需要多长时间全部启动。如果线程数为20 ,准备时长为10 ,那么需要
10秒钟启动20个线程。也就是每秒钟启动2个线程。

1.5.循环次数:每个线程发送请求的次数。如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。
总请求数为20*100=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。

1.6.. 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远) 

1.7.持续时间(秒):测试持续时间,会覆盖结束时间 

1.8.启动延迟(秒):测试延迟启动时间,会覆盖启动时间 

1.9.启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。 

1.10.结束时间:测试结束时间,持续时间会覆盖它。
3.2、http请求
一个HTTP请求有着许多的配置参数,下面将详细介绍:

名称:本属性用于标识一个取样器,建议使用一个有意义的名称。

注释:对于测试没有任何作用,仅用户记录用户可读的注释信息。

服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。

端口号:目标服务器的端口号。

方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。

Content encoding :内容的编码方式,默认值为iso8859

路径:目标URL路径(不包括服务器地址和端口)
3.3、监听器
监听器(Listener)负责收集测试结果,同时也被告知了结果显示的方式。我们常用的包括:聚合报告、查看结
果树、用表格查看结果,都支持将结果数据写入文件。其他的添加上去看看就行。
3.4、聚合报告
聚合报告参数详解: 
	1. Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是
    Name 属性的值 
    
	2. #Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10
	次,那么这里显示100 
	
	3. Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction
    Controller 时,以Transaction 为单位显示平均响应时间 
    
	4. Median:中位数,也就是 50% 用户的响应时间 
	 
	5. 90% Line:90% 用户的响应时间 
. 
	6. Min:最小响应时间 
	 
	7. Max:最大响应时间 
	 
	8. Error%:错误率——错误请求数/请求总数 
	 
	9. Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了
    Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数 
    
	10. KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
	
	一般而言,性能测试中我们需要重点关注的数据有: #Samples 请求数,Average 平均响应时间,
	Min 最小响应时间,Max 最大响应时间,Error% 错误率及Throughput 吞吐量。
3.5.Jmeter组件参数化 (重点中的重点)
3.5.1.参数化是什么
动态的获取并设置数据
3.5.2.为什么使用参数化
执行批量操作,批量添加批量删除,人工效率太低
运用程序代替人工获取并设置数据,安全高效
比如:对被测系统的用户名和密码进行参数化,来模拟多个用户同时登录系统
3.5.3.参数化实现之CSV Data Set Config
通过这个组件可以动态获取并设置数据,实现批量添加操作

第十天内容、jmeter:

1、Jemeter脚本录制方式

BadBoy脚本录制
使用Jmeter自带的代理服务器进行脚本录制

2、正则表达式

在使用Jmeter的时候,我碰到过这样一个问题,就是用户session关联的问题,咱们知道,在网站有登录功能的时
候,我们会获取到一个sessionID,这个sessionID是唯一的,代表一次唯一的会话,每次登录都是一个新的值,
当我们使用badboy录制脚本,导入到Jmeter中时,在执行线程组时候,发生过用户session过期的问题,因为我
们在Jmeter中使用的session是一个定值,导致登录失败。这个我是这样来解决,在登录的时候,我们获取到这
个session,然后设置一个后置处理器--正则提取器将这个session提取出来,作为一个变量,在进行其他操作的
时候,使用这个变量就可以了。这样就完美解决这个问题。

3、先配置jdbc(数据库连接)驱动

1、启动jmeter,打开界面工具,添加一个线程组,添加驱动
2、添加一个JDBC Connection Configuration,连接池配置文件。右键线程组【添加】--【配置元件】--
【JDBC Connection Configuration】Variable Name:连接池名称。JDBC Request会通过此名称来获取连接
池的配置,名称可以随意填写,但是最好具体实际的业务意义,方便理解和记忆。
其他的可以默认,可以根据实际情况来调节优化性能。
Database URL:数据链接url,格式:jdbc:mysql://localhost:3306/host
注释:数据库的ip地址+端口/数据库名(查询数据库端口号show global variables like 'port')
JDBC Driver Class:驱动器名称。固定:com.mysql.jdbc.Driver
Username:用户名
Passowrd:密码
添加一个JDBC Request。
3、右键线程组【添加】-【Sampler】-【JDBC Request】
Select Statement:查询语句
Updata Statement:更新语句
Prepared Select Statement:预编译查询语句。(长时间执行效率更高,支持占位符)
Prepared Update Statement:预编译更新语句。(同上)
Commit (立即提交)Rollback(回滚)
Parameter  values:参数值。参数化sql语句中的值。故输入:localhost,root
Paramter  types:参数类型。数据库的参数你可以去查看一下。这里是两个CHAR,CHAR类型。
Variable names:变量名字,也就是将筛选出来的值放在变量里面。例如这三列数据分为放在变量:A,B,C中
(实际操作中命名一定要有实际意义)。
Result variable name:存储变量名。将整个结果存储在变量中。取名:rs
Query timeouts :超时时间。

第十一天内容、linux简介以及常用命令:

1、操纵系统有哪些:

WINDOW  Linux   MAC   麒麟  DOS

2、Linux的简介:

Linux是一个基于POSIX和unix的多用户 多任务  支持多线程和 多cpu的一个操作系统
Linux的发行版:
      Ubuntu RedHat  CentOS  Debian  SUse  等.....

3、Linux的安装:

1.在虚拟机中进行安装linux   
2.使用云服务的linux  (阿里云 腾讯云)

4、Linux的启动方式:

1.命令行登录  ssh root@公有ip
2.图形界面登录  putt 

5、Linux管理文件和目录的命令

pwd	显示当前目录		ls	查看目录下的内容		cd	改变所在目录		cat	显示文件的内容

rm	删除文件		rmdir	删除目录		vi	编辑文件

pwd命令
该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。
1
ls命令
ls命令用来查看目录的内容。

-a	列举目录中的全部文件,包括隐藏文件

-l	列举目录中的细节,包括权限、所有者、组群、大小、创建日期、文件是否是链接等

-f	列举的文件显示文件类型

-r	逆向,从后向前地列举目录中内容

-R	递归,该选项递归地列举当前目录下所有子目录内的内容

-s	大小,按文件大小排序

-h	以人类可读的方式显示文件的大小,如用K、M、G作单位

ls -l examples.doc	列举文件examples.doc的所有信息

cd命令
cd命令用来改变所在目录。

cd /      转到根目录中 
cd ~     转到/home/user用户目录下 
cd /usr 转到根目录下的usr目录中-------------绝对路径 
cd test 转到当前目录下的test子目录中-------相对路径

cat命令
cat命令可以用来合并文件,也可以用来在屏幕上显示整个文件的内容。

cat snow.txt 该命令显示文件snow.txt的内容,ctrl+D退出cat。

rm命令
rm命令用来删除文件。

-i	互动:提示确认删除

-f	强制:代替互动模式,不提示确认删除

-v	详细:显示文件的删除进度

-r	递归:将删除某个目录以及其中所有的文件和子目录

rm t.txt   该命令删除文件t.txt

rmdir命令
rmdir命令用来删除目录。

vi 编辑文件(补充)
vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的
增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。

进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi n filename :打开文件,并将光标置于第n行首
vi filename :打开文件,并将光标置于一行首
vi /pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑

第十二天内容、Linux安装Jdk、Mysql、Tomcat:

1、安装命令有:
 cd 改变路径
1:    cd /opt        跳到opt目录下。
    解释:cd空格 代表是改变路径,/opt 代表是/下的opt目录-->即:改变当前路径为/opt目录。 路径最
    左边/代表根目录

2:    cd        回到家目录

    解释:输入cd  代表是改变路径,但是后面什么都没有跟--->即:改变当前路径为home(家)目录。

3:    cd .   跳转到当前目录下(没什么意义)
    解释: . 当前路径 --->配置jdk的时候加的classpath 就可以是只配置一个 .
    
4:    cd ..     ..跳转到上一层目录

ls显示文件夹下文件
1: ls    显示当前目录下文件和目录

2: ls /    显示/目录下文件和目录

3: ls /home/candice  显示家目录下文件和目录

4: ls -a    显示隐藏文件

5: ls -R /etc 循环(子目录中的信息显示出来)显示文件

mkdir命令 命令用来创建目录

unzip命令 命令对于zip格式的压缩文件进行解压缩,这种格式的压缩文件带有后缀.zip
2、常见目录说明:
/bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里;

/etc: 存放系统管理和配置文件;

/usr : 用于存放系统应用程序;

vim 文件 : 修改文件的内容(改)

第十三天内容、Python基础:

1、Python介绍
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语
言更有特色语法结构。

Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。

Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序。

Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。

Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的
文字处理到 WWW 浏览器再到游戏。
2、发展历程
Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。
Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、
Unix shell 和其他的脚本语言等等。
像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。
现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用。
3、Python的特点
1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
2.易于阅读:Python代码定义的更清晰。
3.易于维护:Python的成功在于它的源代码是相当容易维护的。
4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容
很好。
5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那
部分程序,然后从你的Python程序中调用。
8.数据库:Python提供所有主要的商业数据库的接口。
9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。
10.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"

4、Pycharm及python安装详细教程

4.1.安装python
1、首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下
图,选择图中红色圈中区域进行下载。

实训一学习总结_第59张图片

2、下载完成后如下图所示

实训一学习总结_第60张图片

3、双击exe文件进行安装,如下图,并按照圈中区域进行设置,切记要勾选打钩的框,然后再点击
Customize installation进入到下一步:

实训一学习总结_第61张图片
实训一学习总结_第62张图片

4、对于上图中,可以通过Browse进行自定义安装路径,也可以直接点击Install进行安装,点击install后便可以
完成安装了。

实训一学习总结_第63张图片

5、为了检查我们的python是否安装成功,可以在命令窗口中输入python进行查询,如显示下图一的信息则表示
成功了,如显示第二张图的信息则表示出错了。

实训一学习总结_第64张图片
实训一学习总结_第65张图片

4.2.安装pycharm
1、首先从网站下载pycharm:点击打开链接
(链接为:http://www.jetbrains.com/pycharm/download/#section=windows),
进入之后如下图,根据自己电脑的操作系统进行选择,对于windows系统选择图中红色圈中的区域。

实训一学习总结_第66张图片

2、下载完成之后如下图:

实训一学习总结_第67张图片

3、直接双击下载好的exe文件进行安装,安装截图如下:

实训一学习总结_第68张图片

点击Next进入下一步:

实训一学习总结_第69张图片

点击Next进入下一步:

实训一学习总结_第70张图片

点击Install进行安装:

实训一学习总结_第71张图片

安装完成后出现下图界面,点级Finish结束安装:

实训一学习总结_第72张图片

下面我们来创建自己的第一个程序:

1、单击桌面上的pycharm图标,进入到pycharm中,如下图所示:

实训一学习总结_第73张图片

2、我们选择第二个,然后点击Ok:

实训一学习总结_第74张图片

3、点击上图中的Accept进入下一步:

实训一学习总结_第75张图片

4、点击上图中的ok进入下一步:	

实训一学习总结_第76张图片

5、点击Create New Project,进入如下图的界面,图中的Location是选择你安装的python的位置,选择好后,
点击create。

实训一学习总结_第77张图片
实训一学习总结_第78张图片

5.第一个Python程序

5.1.创建python file

实训一学习总结_第79张图片

5.2.练习打印hello world

实训一学习总结_第80张图片

第十四天内容、Python基础:

python优点

简单易学 、免费开源、丰富的库、可扩展性、可移植性、面向对象、规范的代码。。。

缺点:执行效率相对慢

1、Python中函数

1. 函数的作用
提高代码的复用性
提高开发效率
减少维护代码维护量
2.定义函数格式
Def 函数名():
  代码
3.函数调用:
通过 函数名() 调用
4.函数的参数
定义:为了让一个函数更通用

例:
# 函数名里定义两个参数
def func(a,b):  # 此参数为 形参
    # 定义方法
    c = a+b
    print(c)
#  调用时添加具体值
func(3,6)  # 调用的参数为 实参
5.缺省参数
定义:在形参中有默认值的参数,称为缺省参数
注意:缺省参数要放到形参最后面
例:
def func(a,b=3):
    # 定义方法
    c = a+b
    print(c)
#####  调用时添加具体值
func(3)
6.不定长参数
*args: 存放的参数为元祖类型

例:
  	 
def s(*args):
    	print(type(args))

    s(1,2,3,4)

	**kwargs: 存放数据为字典类型
	例:
		def s(**kwargs):
    			print(type(kwargs))

    		s(a=1,b=2,c=3,d=4)
7.多个不定长参数的存放顺序
*args,缺省参数,**kwargs
8.函数的种类
(1)无参数,有返回值
	例:
def func():
    print('烫火锅')
func()

(2)无参数,无返回值
	 例:
def func():
    s = '烫火锅'
    return s
print(func())

(3)有参数,有返回值
	 例:
def func(a,b):
    s = a+b
    return a,b
print(func(4,5))

(4)有参数,无返回值
	 例:
def func(a,b):
    s = a+b
    print(s)
func(4,5)
9.函数嵌套
执行顺序:
例:
def func():
    print('烫火锅')
def fun2():
    print('第一次调用')
    func()
    print('第二次')
fun2()

2、局部变量

就是在函数内部定义的变量
作用范围函数内部,函数外部不能调用
局部变量作用:为了临时保存数据需要在函数中定义变量来存储。
  例:
def func1():
    a = '高铁'
    print('----修改前---a=%s'%a)
    a = '飞机'
    print('---修改后----a=%s'%a)
def func2():
    a = 400
    print('------a=%d'%a)

func1()
func2()

3、全局变量

1. 什么是全局变量
一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量

例:
	# 在函数外定义变量称为 全局变量
# 定义全局变量
a = '烫火锅'
def func1():
    print(a)
def func2():
    print(a)
func1()
func2()
2. 修改全局变量
关键词:global
格式:global a	修改多个 , 隔开
使用global对全局变量进行修改

		例:
a = '烫火锅'
def func1():
    global a
将变量a声明为全局变量
a = 100
print(a)
def func2():
    print(a)
func1()
func2()

4、递归函数

1.递归函数
一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
计算n的阶乘:
例1循环操作:
def func(n):
    i = 1
    s = 1
    while i<=n:
        s = s * i
        i += 1
    return s
print(func(10))
	例2递归操作:
def func(n):
    if n>1:
        res = n * func(n-1)
        return res
    else:
        res = 1
        return  res
print(func(0))

第十五天内容、Python中的面向对象:

面向对象

面向对象的三大特点:封装、继承、多态
面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向对象编程2个非常重要概念:类和对象
类(抽象): 具备相同特征和行为的一类事物的统称
对象(具体): 一个具体的事物
对象是面向对象的核心;
1、类的组成

类由三部分组成:

类的名称:类名
类的属性:一组数据
类的方法:他的行为
对象 = 属性 + 方法
	静态 + 方法
2、定义类
格式:
class 类名(object):
方法 
object是顶级父类;
类名的命名规则:大驼峰命名法
3、创建实例化对象
格式:
	对象名=类名()
例:
	# 定义类
class Car():
    # 定义实例方法:
def move(self):
	#当对象调用实例方法时,Python会自对象本身的引用做为参数,传到实例方法的参数self里
		print('车在奔跑...')

	# 创建一个实例化对象,并用变量BMW来保存它的引用
	# 创建一个实例化对象,他可以调用类的方法和属性
bmn = Car()
bmn.move()
4、创建实例属性
例:
class Person(object):

	def info(self):
	print('名字%s' % (self.name))

xiaoming=Person()
	# 添加属性,以及对应的值
xiaoming.name="小明"
xiaoming.age=12
xiaoming.grade=3
print(xiaoming.name)
	# 调用方法输出
		xiaoming.info()
5、魔法方法:init()
__init__():初始化属性,在创建对象时,会自动调用该方法初始化属性,还可以通过传参设置不同的属性值
__init__(self) 中的self参数,不需要传递,python解释器会自动把当前的对象引用传递过去。

例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age

person1=Person("小明","男",19)
person2=Person("小红","女",20)

print(person1.name,person1.sex,person1.age)
print(person2.name,person2.sex,person2.age)
6、魔法方法:str()
例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __str__(self):
        # 可以通过该方法来自定义对象的输出信息
        student= "我的名字叫%s的%s" % (self.name, self.age)
        return student
	person1=Person("小明","男",19)
	print(person1) 
7、魔法方法:del()
例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age

    def __del__(self):
        # 在对象被销毁时,自动调用该方法
        print( "%s死了" % self.name)

person1=Person("小明","男",19)

del person1
8、私有属性和方法
1.在属性名和方法名前面加 "__",该属性和方法就是私有属性和私有方法
2.私有属性和私有方法,只有在方法内部可以访问,在类外部不能访问
3.  不管是修改还是访问私有权限的属性,必须通过公有的方法来实现
4.  子类不能继承父类的私有属性和方法

1、私有属性

例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.__age=age
    def get_age(self):
        return self.__age
    def set_age(self,a):
    self.__age = a
person1=Person("小明","男",19)
	# 调用方法
person1.set_age(30)
print(person1.get_age())

2、私有方法

在方法名前,加 __ ,该方法就是私有方法

例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age

def __set_age(self,a):
	# 在私有方法内修改
    self.age = a

def login(self):
	# 在公共方法内部,调用私有方法
    self.__set_age(30)

person1=Person("小明","男",19)
	#调用公共方法
person1.login()
	#展示
print(person1.age)
9、类属性
在类名和方法中间定义的属性,称为类属性
例:
class Person:
address="china"
def __init__(self,name,age):
    self.name=name
    self.age=age

person1=Person('zhangsan',19)
	 #实例对象调用
print(person1.address)#earth
 	 #类名调用
print(Person.address)#earth
10、类方法和静态方法
一类事物的共同行为,定义为类方法
类方法可以访问类变量,但不能访问实例变量
类方法的参数为cls,代表类本身,通过cls可以访问类属性或类方法

静态方法不需要多定义参数,可以通过对象和类来访问
静态方法不能访问类变量和实例变量,也不能使用self

例:

class Person:
    count = 10
    address = 'china'
    def __init__(self,name,age):
        self.name=name
        self.age=age
	# 静态方法修饰符
@staticmethod
def get_address():
     return Person.address
	# 类方法修饰符
@classmethod
def money(cls):
     return cls.count

person1=Person('zhangsan',19)
	# 实例对象调用
print(person1.money())#earth
	# 类名调用
print(Person.money())#earth

七、继承

一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
1、继承的优点
1. 提高代码重用性
2. 可以继承父类的方法和属性
3. 可以减少代码量,提高开发速度
2、单继承
子类继承自多个基类
例:

class Dog(object):
    def __init__(self,name,color="黄色"):
        self.name=name
        self.color=color
    def run(self):
        print("%s在跑着"%self.name)

class JinMao(Dog):
    def setNewName(self,name):
        self.name=name

dog1=JinMao("大黄")
dog1.run()
dog1.setNewName('小黄')

print(dog1.name)
3、多继承
子类继承自多个基类
例:

class Ma(object):
    def printMa(self):
        print("ma的特性")
    def run(self):
        print("万马奔腾")
class Lv(object): 	
    def printLv(self):
        print("lv的特性")
    def run(self):
        print("万驴奔腾")
class LuoZi(Ma,Lv):		
    def printLuo(self):
        print("骡子的特性")

luo=LuoZi()
luo.printLuo()
luo.printLv()
luo.printMa()
luo.run()
4、多级继承
例:
class Ma(object):
    def printMa(self):
        print("ma的特性")
    def run(self):
        print("万马奔腾")
class Lv(object): 	
    def printLv(self):
        print("lv的特性")
    def run(self):
        print("万驴奔腾")
class LuoZi(Ma,Lv):		
    def printLuo(self):
        print("骡子的特性")
luo=LuoZi()
luo.run()
print(LuoZi.__mro__)
5、多重继承
允许从多个父类继承,称为多重继承
例:
class Ma(object):
    def printMa(self):
        print("ma的特性")
class Lv(Ma):
    def printLv(self):
        print("lv的特性")
class LuoZi(Lv):
    def printLuo(self):
        print("骡子的特性")

luo=LuoZi()
luo.printMa()
6、方法重写及调用父类方法
子类与父类方法同名,子类会覆盖父类方法

子类想要保留继承父类的属性,还想有自己独有的属性:
1.	子类需要重写自己的__init__方法,
2.	在__init__方法中,通过super().init()的方式调用父类的初始化方法,可以继承父类的属性
3.	在__init__方法中,通过self方式可以添加自己独有的属性
例:
class Person():
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def money(self):
        print('我有1000')

class Student(Person):
    def __init__(self,name,sex,age,hight):
        super().__init__(name,sex,age)
        self.hight = hight
    def money(self):
        print('我有100')

person1=Student("小明","男",19,178)
print(person1.name,person1.sex,person1.age,person1.hight)
person1.money()
7、多态
1.多态是面向对象的重要特性,简单点说:“一个接口,多种实现”

2. 指一个基类中派生出了不同的子类,且每个子类在继承同样的方法名的同时又对父类的方法做了不同的实现

例:
	class Person(object):
	    def __init__(self, name, gender):
	        self.name = name
	        self.gender = gender
	    def address(self):
	        return '中国 ' + self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super().__init__(name, gender)
        self.score = score
    def address(self):
        return '北京 ' + self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def address(self):
        return '广东 '+ self.name

p = Person('张三','男')
s = Student('小明','男',88)
t = Teacher('老王','男','语文')

print(p.address())
print(s.address())
print(t.address())

你可能感兴趣的:(实训一学习总结)