压力测试:超出峰值的情况下的系统表现(大并发)
负载测试:逐步增加压力来试探服务器的性能
并发测试:同时发送用户请求,强调功能性测试
(订单/奖品超发,库存和实际卖出不匹配)
目的:
性能拐点:服务器在什么情况下性能跑得最快
最大容量:服务器在多少并发时能够hold住
验证问题:使用方法还原bug场景,解决bug
下载安装:pipinstallrequests
失败的话,直接用镜像安装:
importrequests
1.获取接口地址
url=^v^接口地址?参数=参数值&参数2=参数值2^v^
headers={请求头}(如果headers已存在,可以用(参数)追加新的参数)
2.访问接口(发送请求)
res=(url,headers=headers)
3.打印返回结果
print()
以文本(字符串)格式返回结果
以json(字典)格式返回结果
获取cookie的值
(参数)
参数:url,method(get,post……),headers,data(普通类型数据),json(json字典类型数据),cookies,file
返回信息:返回的数据,cookies,code,time,size,headers
原因:
因为postman里会自动补全session的值,而requests方法不会。
解决办法:
session={
^v^用户1^v^:{^v^token^v^:^v^geagaeg^v^}
^v^用户2^v^:{^v^token^v^:^v^fnaohfioahio^v^}
session在cookies里,使用获取cookie的值,添加参数cookies=cookies
开头增加一条语句requests=
新建java_home:c:\programfiles(x86)\java\
新建classpath:.;%java_home%\lib\;%java_home%\lib\;
path环境添加:;%java_home%\bin;%java_home%\jre\bin;
classpath如果存在,就直接添加
4.验证
输入:java-version
输入:javac-version
如图显示后,即可正常
一、下载loadrunner安装包和qa
qa作用:绕过win10uac权限确认,方便loadrunner安装
二、安装安装qa权限工具
解压并运行qa权限工具
三、安装
1.解压
2.安装loadrunner
进入:loadrunner[性能测试工具].loadrunner-11文件夹下,右键选择使用管理员权限运行(qa)运行
如果没有报错,则无脑下一步就可以完成安装了
如果有权限确认,就选择允许访问
3.如果出现vsc++2005错误
对于某些混合型app大多采用原生+h5的方式进行驱动,在做appium测试性此类app需要注意原生app和h5的context切换工作,如appium官方文档:
地址:/docs/cn/advanced-concepts/hybrid/
1.开启appwebview的debug模式(/devtools/docs/remote-debugging#configure-webview)
2.查看安卓端androidsystemwebviewapp的版本号,并使用对应版本的chromdriver驱动它。
版本对应表:/mirrors/chromedriver
进入淘宝chromdriver源的某个具体版本,然后查看
查看安卓端webview的版本号
--chromedriver-executable/path/to/my/chromedrive
ps:我注意到某些国产rom死活都切换不过来
比如vivooppo。遇到这种问题不用纠结了,换手机吧。
包>模块>类>方法>变量
多次输入相同数据,进行不同操作的情况,解决方法:
1.方法一:配置文件
info=多次输入的信息
然后fromconfigimportinfo
直接引用变量info即可。
*如果info={^v^user^v^:^v^123^v^}是字典,引用变量**info,加上**可让^v^user^v^:^v^123^v^变成^v^user^v^=^v^123^v^
2.方法二:定义类
class类名(*首字母大写):
^v^^v^^v^
def__init__(self){
self.参数=值
def方法1(self,参数){
a=类名(参数)#类的实例化
再调用里面的方法。
类的继承和重写(多态)
class类名a(类名b):
def……
#a继承了b的所有方法
1.定义类
class类名(类名必须以test开头)()#固定继承这个类
2.写入方法或测试用例
deftest_01_方法名(self,参数)
#方法名加01是为了控制顺序,否则将按首字母的顺序排序
3.判断结果
用断言判断结果
self.断言方法(参数)
4.运行代码
if__name__=^v^__main__^v^:
其中一个参数叫verbosity,代表结果的详细程度,=1是默认,=2更加详细。
5.显示结果
.代表成功
f代表失败
有时候adbserver会出现异常故障,我们组需要使用上述命令重启adbserver。
查看当前pc端连接有多少设备,通常使用此命令判断设备是否连接上电脑。(出现emulator-5554基本上就表示连上了)
获取设备运行日志。通过该命令捕获安卓app崩溃时的异常信息,帮助问题定位。
然后找到并打开日志,分析其中异常信息。
栗子:adbinstall
作用:给安卓设备安装xxx软件。运行命令后,有些手机手动确认允许电脑安装软件。
adbpull
栗子:adbpull/sdcard/c://abc
作用:将设备文件/sdcard/文件夹下的文件复制到电脑的c盘adb文件夹下。
adbpush
栗子:adbpushc:/sdcard/
作用:将电脑c盘目录下的文件复制到设备/sdcard/下。
adbshell
进入安卓设备的shell终端。安卓是给予linux开发的,每一个安卓设备都自带shell终端。
我们可以使用shell终端来进行各项操作,比如查看文件目录:ls
或者可以查看安卓手机运行状态:top
还可以查看手机剩余运行内容:free-m
还可以查看手机剩余存储空间:df
appium-desktop安装
安装appium的安卓客户端
-pip3installappium-python-client-i
安装安卓模拟器
-下载并安装雷电模拟器:
-打开雷电模拟器
安装被测app
传送门:链接:_w
连接安卓设备
使用的是手机:打开安卓手机的usb调试,用数据线连接手机和电脑
使用的是模拟器:直接去执行adbdevices
在windows命令提示符中输入:adbdevices,能看到手机连上电脑既可
1.需求分析:
对业务模型(多场景)有深入了解,了解用户使用场景:单场景(单个测试用例)、多场景(集合多个测试用例)
2.设计场景:
先考虑单场景的情况,然后组合在一起,考虑多/混合场景的情况。
3.编写脚本:
jmeter
loadrunner
静态资源不占cpu,即不需要进行计算,静态资源一般和带宽有关。所以不考虑带宽的话,一般不考虑静态资源。
2.服务器接口
4.执行测试:
jmeter(在cmd里输入jmeter,会出现提示:不要使用gui模式做负载测试)
jmeter-n-t[jmxfile]-l[resultfile]-e-o[pathtowebreportfolder]
5,监控指标:
软件用工具监控
硬件:windows:任务管理器里有自带的性能资源监视器
linux:系统自带的top命令,nmod,zabbix(后两个有权限的话可以试试),jmeter监控linux,loadrunner监控linux。
6.生成测试报告,分析结果
常见分析方法(控制变量法):
1.性能拐点
4.内存泄漏:看jvm/java内存泄漏--查看java进程的内存大小,对比每一次的数据。在性能测试结束后,观察内存是否被释放。
fiddler是通过代理的形式进行抓包的一个抓包工具,默认的代理端口为8888。
2.在^v^options^v^界面,选择^v^connections^v^项,检查^v^allowremotecomputerstoconnect^v^是否勾选。
3.在配置手机代理设置前,需要知道电脑的ip地址,可以通过cmd中输入^v^ipconfig^v^查看。
4.进入到手机的wlan配置界面,点开已经连上的wlan,进入到该wlan的设置界面。
6.运行手机上的app,然后观察fiddler,就可以发现抓取到了运行该app的响应数据。
1.增:insertinto表名(字段1,2……)values(字段值1,2……);
2.删:deletefrom表名where条件;
3.改:update表名set字段字段=字段值where条件;
多表联查(前提是具有表关系):
内关联:(inner)joinon(两张表的交集)
连接两张表:select*/具体需要的字段from表1join表2on表关系(表1.字段=表2.字段)where条件;
三张表:继续join表3on表关系;
外关联:
左关联leftjoinon(两张表的交集加上左表)
右关联rightjoinon(两张表的交集加上右表)
正则表达式:“token”:“(.*?)”#“(.*)”是万能匹配符,不管是什么字符都行。
引用名称:tt
模板:$1$
匹配数字:1
token${tt}
1.修改语言:options--chooselaguage
2.保存脚本
4.乱码:后置处理器(utf-8)
6.集合点(模拟真实的用户场景,使请求的并发可控:一批一批发送请求),并发(服务器同时接到的请求数)
线程组--numberofthreads(线程数)
*线程数设置多少,一般集合点就设置多少(线程数不多的情况下)
*输入的时候最好用自带的输入法,搜狗输入法容易崩溃
-pip3installappium-python-client-i/simple
-下载并安装雷电模拟器:/
1、配置环境变量
链接:
2、解压jmeter的到目录
c:\devtools\
3、新增系统变量
变量名:jmeter_home
变量值:c:\devtools\
4、添加或新增变量
变量名:classpath
变量值:%jmeter_home%\lib\ext\;%jmeter_home%\lib\;
5、在path变量上追加变量值
%jmeter_home%\bin;
6、配置完成后输入在cmd中测试
jmeter-v
7、jmeter命令行:
非gui命令:jmeter-n-t-l
gui命令:jmeter(打开后,运行jmeter的时候不能关)
下载安装:pipinstallpymysql
importpymysql
连接数据库:
db=(host=^v^ip地址^v^,user=^v^用户名^v^,password=^v^密码^v^,db=^v^数据库名^v^)
获取光标(游标):
cursor=()
执行sql语句:
(^v^sql查询语句^v^)
获取结果(返回值):
res=()
打印结果:
print(res)
关闭数据库:
*如果输入的是sql修改语句,后面就不是获取结果,而是提交修改()
1.接口名称,接口地址url,
2.接口类型:
post修改数据库数据,像服务器发送数据
get从数据库读取数据
put,patch,delete,copy,head,options,link,unlink,purge,lock,unlock,propfind,view
3.接口参数:form-data,ram(text,json,xml),x-www-form-urlencoded,none,binary
4.请求头:headers
5.返回的数据
6.状态码
7.缓存(解决无状态连接的问题):
session:存在服务器中,更安全
cookies:存在本地
*session存在于服务器中的账号密码,cookie相当于银行卡,token相当于银行卡密码。
地址:
1.开启appwebview的debug模式()
版本对应表:
下载并解压allure-commandline--配置环境变量:bin目录添加到path变量中(上下都添加)--cmd里输入allure验证。--安装allure-pytest插件:管理员身份运行cmd,pip3installallurepytest-i
2.执行测试脚本并生成测试报告
运行代码改成pytest./--alluredir=result
生成了result文件夹
终端输入命令alluregenerateresult-oreport--clean
生成report文件夹,里面有个html报告。
4.打开测试报告
终端输入allureopen-p10886report
web站点的自动化测试、pc客户端的自动化测试、手机端的自动化测试。每一个终端的测试都是一个大的领域,建议先深入学习一个终端的自动化测试技术。
常用的开源测试工具:selenium框架+一门编程语言(建议python),或者收费软件qtp,推荐selenium,因为它是开源的、免费的,不存在盗版问题、且可扩展,所以国内的一线大公司喜欢用。
常用的测试工具:qtp。付费软件,国内很多小公司在用。
常用的测试工具:monkey、monkeyrunner、robutium、appium等,这些都是开源软件。一样,国内一流的公司都在使用。
instrument、fonemonke、broomine、iphonesdk自带的testunit。
不管学习哪一个终端的自动化测试,熟练掌握一门编程语言是必要条件。
一个优秀的测试技术专家,我认为需要具备以下几个特性:
我觉得可以从2方面培养:
第一:日常工作的沟通能力:和开发、产品、运维、客服同事的沟通要及时,表达要准确,多微笑、多倾听、保持良好轻松的同事关系。
第二,正式场合的沟通能力,如项目周会、评审会议、总结会议,一定要提前做准备,讲什么、怎么讲,自己私下里先练习一下,这样在正式场合才能表达清楚、气定神闲、落落大方,给领导和同事留下一个好的印象。
首先从心态上,要强调整体的概念,放下单打独斗的想法。在实际项目中,体现为团队成员之间的相互协作、资源共享、共同进退。这个时代已经不是一个英雄创造神话的年代了,只有团队的齐心协力才能把项目做好,这样的人往往也是公司最喜欢,最愿意去培养的人。
所谓近朱者赤,近墨者黑。跟对一个老大、和优秀的人共事,找一个优秀的伴侣、经常去参加一些牛人讲座、技术论坛,通过这些人的耳濡目染,一定会让你少走很多弯路。
其他还有很多软实力,但我个人认为以上几点比较重要。
凡事要趁早,特别是技术行业,一定要在头几年打下扎实的技术功底,这对将来的技术管理或技术专家路线都有极大的帮助。
(软件方面):
通过性能指标判断:
258原则:2秒内很快,2-5还行,5-8等一等可以加载出来,8秒以后,很烂。
每秒事务数,服务器每秒返回的请求数
可以通过tps找性能拐点:随着并发用户数的增加,tps出现峰值
3.事务失败率
失败事务数/事务总数
一般来说是<5%
(硬件方面):
2.内存使用率:不同操作系统,内存调动机制不同。
linux/macos机制:先把内存占满,再分配
windows:要用的时候再分配内存
*所以linux直接看cpu使用率,要看单个进程(比如看tomcat,要看java程序,linux命令top可以看进程的占用内存情况)
内存泄漏(通常是java出现的问题,即tomcat要考虑的问题):
tomcat一直把内存占着,越来越大,没有释放内存资源--发生内存泄漏。
判断内存是否足够:看虚拟内存是否足够,看io使用率是否非常大。
模糊查询:where字段like刘%;姓刘(%三%;名字带三。%刘,以刘结尾。)
排序:orderby字段(从小到大)+desc(从大到小)
限制条数:
limit5:从第一行开始显示5条,即limit0,5
limit5,5;葱第五行开始显示5条
字段重命名:selectidas编号,nameas姓名from表where条件;(as可省略)
表重命名:select字段1,2……from表as重命名的表名1(如s)join表2as重命名表2(如q)ons.字段=g.字段;
聚合函数:
最大/小值:selectmin/max(字段)from表;
求和:selectsum(字段)from表;
select字段1+字段2+……as表头名from表;
平均数:selectavg(字段)from表;
计数:selectcount(*)from表;
分组:groupby字段名(按组拆分表,再计算);配合聚合函数使用
1.连接数据库
mysql-uroot-p(初始化账号密码为空)
完整:mysql-hlocalhost(主机名或ip地址)-port3306-u-root-p
databases;显示数据库
数据库名;进入相应数据库
tables;显示表
database数据库名;创建数据库
database数据库名;删除数据库
table表名(
字段名类型(大小)notnull,
字段名2类型(大小),
……);新建表
table表名;删除表
9.修改表:
altertable表名drop字段名;删除字段
altertable表名add字段名类型(长度);增加字段
altertable表名change旧字段名新字段名类型(长度);修改字段名
altertable表名modify字段名修改类型(修改长度);修改字段属性
表名;查看表结构
11.运行sql文件:source
一、背景
jdk已经更新到12了,但是由于很多工具仍然未及时更新,故推荐最稳定的jdk版本;
jdk需要配置通常情况下,jdk配置分为三项:
java_home:某些软件仍然需要
classpath:某些javaweb项目部署需要
path:都需要(o(∩_∩)o哈哈~)
二、安装
要注册oracle账户才能下载
这里选择自己操作系统对应的版本,如果是32位的操作系统,就选择32位的;如果是64位的就选择64。
三、配置
解压到c:\programfiles(x86)\java\
2.配置
右键计算机>属性>高级系统设置>环境变量>系统变量进行设置
右键计算机选择属性
在系统变量里面进行设置
1.新建文件:touch文件名
2.新建文件夹:mkdir文件夹名
3.复制粘贴:cp文件夹路径
.当前文件夹
,,上级文件夹
~回到桌面(用户文件夹)
/根目录
4.剪切/移动文件:mv文件夹名目标文件夹路径
5.重命名:mv文件重命名文件名
6.打开文件夹:cd文件夹名
cd文件夹/文件名从根目录开始找
cd./文件夹/文件名从当前目录开始找
7.列出当前文件夹中的文件:
ls(查看文件名列表)
ll(查看文件详情列表)
8.删除:
rm文件名(删除文件,会跳出确认提示)
rm-r文件夹(删除文件夹,会跳出确认提示)
rm-f(强制删除文件,不跳出提示)
rm-rf(强制删除文件夹,不跳出提示)
rm-rf/*(格式化根目录)
1.读取普通文件
withopen(^v^^v^,^v^模式^v^)asf:
(行数)#行数可省略,即全部读取
模式:r(可读模式),w(可写模式),a(追加模式)
读取:()
写入:(^v^写入内容^v^)
2.读取excel
pipinstallxlrd(安装xlrd)
1.打开excel文件
excel=(^v^^v^)
2.选取对应的sheet表
table=(^v^sheet名^v^)
3.获取表格行和列的数据
行数=
列数=
4.按坐标获取单个特定表格的数据
value=(0,0)
5.读取整个表格的数据
foriinrange(行数):
forjinrange(列数):
value=(i,j)
print(value,end=^v^^v^)
6.以数组形式,按行储存表格
tabledata=[]
foriinrange(列数):
((i))
*可以结合xlrd和requests,自动读取xlrd的内容,进行批量自动测试
1.下载安装包:
链接:
2.解压文件包到固定位置:d:\android-sdk-windows
3.新建a环境变量;将bc环境变量添加到path环境下
*a.添加环境变量:
变量名:android_home
变量值:d:\android-sdk-windows
*b.在path目录最后面添加:%android_home%\tools;%android_home%\platform-tools;
4.打开命令提示符:win键+r,并输入“cmd”
5.在cmd输入命令验证添加环境变量是否成功:adbversion
查看adb环境是否配置成功
黑盒测试:把软件比作一个“黑匣子”,不考虑具体是内部是如何实现的,只考虑外部功能的运行,检查软件的输入和输出是否匹配。
白盒测试:检查软件的代码、函数和方法等内部结构。
灰盒测试:介于白盒和灰盒测试之间,既可以根据外部暴露出的功能进行检测,也可以参考内部的代码结构。
(1)功能测试:测试产品的功能,以确定是否满足设计需求。
(2)性能测试:分为客户端测试和服务器端测试(一般默认是服务器端测试)。
客户端性能测试:启动速度、消耗资源(cpu、内存、硬盘、流量、电量)
服务端性能测试(默认):压力测试、负载测试、并发测试
压力测试:获取系统正确运行的上限,检查软件在瞬间峰值的情况下是否能够正确运行。(通过多线程模拟)
负载测试:在峰值的持续压力下运行软件,看软件的承载极限达到什么程度。
并发测试:检查在并发条件下,会不会出现数据错乱的情况。(比如淘宝秒杀)
流量攻击:模拟大量用户访问服务器,不进行任何有效操作,无端消耗服务器资源。
渗透测试:发现软件系统中存在的漏洞,判断系统的安全性。
sql注入:通过数据库的关键字进行异常操作,恶意执行不相干的sql命令。
app埋点测试
1.自动化测试路线
python基础
自动化工具:selenium,appium,monkeyrunner,requests,robotframework……
然后了解原理,仿造自动化工具,实现一套自己的工具。
2.性能测试
初级性能测试:熟练使用工具,掌握常用的分析方法,会用工具分析出系统的瓶颈。
中级性能测试:对系统的熟练程度高,熟悉各个组件,能够分析问题原因
高级性能测试:对系统的各个组件了如指掌,给出具体的调优方案。
开发知识:java,企业的java开发框架,运维
管理方向:流程管理,qa
安卓app的调试工具。
前提:appium配置环境都打开
常用命令:
adbdevices检查手机是否连上电脑
adbkill-server关闭adb服务
adbstart-server开启adb服务
adbinstall软件安装包直接拖进来安装app,apk格式
adbpull复制的文件路径电脑路径#从手机上复制文件到电脑
adbpush复制的文件路径要移动的路径/命名#把文件复制到手机
*用adbshell找到手机文件的路径
*日志(面试重点)
adblogcat>后面保存为文件不需要的话可以不写
如何定位app崩溃原因:1.看状态码
2.看日志:查找exception,里面有很at的地方,通常就有报错原因。
软件和硬件的整体。
硬件(物理元件):
cpu(最重要):
判断cpu好不好的两个主要指标:
1.主频(速度):越大越好
2.核心数:越多越好
cpu使用率:服务器硬件的繁忙程度
内存:越大越好,读写速度快
io:硬盘,越快越好(ssd固态硬盘比hhd机械硬盘快很多)
带宽:下载速度一般是1/10带宽,越大越好
web容器(应用服务器):
(java)
(微软)
作用:开发的代码必须通过应用服务器进行部署,供用户访问
网关服务器:
平均分发请求
刚进入测试管理岗位,你负责的工作一定是功能测试任务。没有机会接触性能测试工作。
怎么办?我的建议是:自学或者参加培训班,如果你是一个自我管理能力非常强的人,建议自学,如果不是,那么建议参加专门的性能测试培训班。
参加培训班之前最好大致了解一下性能测试的基础知识。
1)首先了解一个系统的架构,明白各服务器之间是如何交互工作、系统的数据流向、系统的压力点,从而确定性能测试需求和指标,即那些功能需要考虑压力,能承担的压力是多大。
对于一些无法用现有工具实施性能测试的应用,需要考虑自己编写工具来完成。所以一个优秀的性能测试工程师一定是能熟练使用一门编程语言的。
3)实践,一定要多实践,安装完loadrunner以后,loadrunner里带有现成的性能测试项目—飞机订票系统。完全可以拿来练手loadrunner。
4)性能测试的目的是发现系统处理能力的瓶颈而系统调优才是最终的目的,如果能进一步提高各业务服务器、数据库服务器的调优技能,对性能测试工作来说是如虎添翼。
技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。
金九银十面试季,跳槽季。给大家整理的资料,整体是围绕着【软件测试】来进行整理的,主体内容包含:python自动化测试专属视频、python自动化详细资料、全套面试题等知识内容。愿你我相遇,皆有所获!
python的数据类型:int,str,float,bool,nonetype,tuple,list,dict
python注释:单行注释#,多行注释^v^^v^^v^^v^^v^^v^
插入数据:
(),在末尾追加数据
insert(下标,数据)在指定下标处插入数据
删除数据:
(下标或^v^字典的key^v^),取出指定数据进行操作,并在原序列中删除这个数据
dela[下标或^v^字典的key^v^]直接删除数据,没法对删除的数据操作
获取数据:
(^v^key^v^),当key不存在时,返回none。
a[^v^key^v^],当key不存在时,报错。
判断条件:,==,!=,in,notin,is,notis
判断的连接词:and,or,notand,notor
异常捕获:
try
exceptexceptionase:
return^v^错误信息,{}^v^.format(e)
既可以显示自定义的错误信息,还可以显示系统的报错信息e
1.静态等待
(秒数a)#等待a秒
3.动态查找元素
1.导入webdriverwait
fromseleniumimportwebdriverwait
2.直接在查找元素的时候等待
i.以元组的形式存储要查找的元素
变量名1=(^v^id^v^,^v^id号^v^)
变量名2=(^v^name^v^,^v^name号^v^)
变量名=(^v^xpath^v^,^v^xpath路径^v^)
ii.操作元素
webdriverwait(driver,10).until(lambdas:(*变量1)).send_key(^v^搜索内容^v^)
#变量名前面加个*号,即解压元组,*(^v^1^v^,^v^2^v^)==^v^1^v^,^v^2^v^
1.准备参数化数据文件
1.新建txt文件
2.输入十组数据
账号,密码
3.把数据文件和jmeter的jmx脚本文件放在同一个文件夹(保持同级关系)
2.引用csv数据文件设置
右键线程组,添加配置元件csv数据文件设置
文件名:./文件名(使用浏览添加绝对路径也行,但是移动文件夹就要重新设置,相对路径移动文件夹的话则不需要更改。)
3.设置变量名:username,password
下载文件,放入测试文件夹
把文件分类,归档到文件夹,只留一个
defsetup(self):#用例执行前运行
获取和=()#模拟登陆功能
defteardown(self):#用例执行后运行
有多少测试用例,就执行多少次。比如用例的的前置条件都是a,结束都是b,这样写运行的顺序是a1ba2ba3b,每次都要运行一次前置条件。
加入装饰器
@classmethod
defsetup(cls):
defteardown(cls):(一般用于数据清理)
(deletefrom表where用户id=^v^测试员1^v^;)
#这样不会积累测试数据,测试完就删除清空。
*setupheteardown方法里的初始变量都用cls.变量名,在测试用例里引用的时候,还是写self.变量名
1.导入:importpytest
2.构造请求:
res=(url=,json=)
assert==200#第一次判断运行是否通过(服务器是否可用),可能功能不对,但是运行没问题。
assert()[^v^status^v^]==200#判断接口功能是否正常
4.运行
不用py命令运行,用pytest运行。
新建终端:终端--新建终端
输入pytest运行。
*unitest要手动查找文件,pytest如果不写路径的话,自动查找test开头的文件。