本文以PHP项目做为例子
所须要拥有(准备)的:php
Github
帐号html一个项目git
看着篇幅挺大的,不免有什么遗漏,若是文中有错误的地方,还请各位斧正!谢谢。
由于原本篇幅就大,因此就没配图了,若是有不少人反馈看不懂或者失败了,我再后期补下图。谢谢!github
项目为保证项目始终处于健康稳定的状态,咱们须要一个能够持续的自动的对贡献的代码进行自动化测试的服务。Travis-CI
就是在这样的背景下于2011年开启服务,到如今为止已经有超过300k个开源项目和235k的用户在使用。json
Travis-CI
所作的工做就是自动在虚拟机中运行.travis.yml
中设定的内容进行单元测试,生成并导出报告。bootstrap
开源项目之间通常有着相互依赖的关系,好比项目A的一个组件依赖于另外一个项目B。当这种依赖关系多了以后就须要一个管理依赖的工具。数组
Composer
就是PHP的一个依赖管理工具。它容许你申明项目所依赖的代码库,而且会在你的项目中安装他们。Composer中文markdown
Packagist is the main Composer repository. It aggregates public PHP packages installable with Composer.app
这个网站是主要的Composer仓库,经过Composer发布的项目,所储存的仓库就是这个网站,这也是Composer安装依赖的下载来源。可使用Github帐号登陆composer
登陆以后能够提交本身的项目,不过须要项目中有composer.json
文件,这在以后进行介绍。
单元测试中,代码覆盖率常常被用来衡量测试好坏的指标。
所谓的代码覆盖率简单的说就是在运行完测试用例以后,走过了多少句的代码,好比说,你要测试的一个函数有100行,可是测试用例只走过了80行,因此这个测试用例的代码覆盖率就是80%
Coveralls
就是一个根据单元测试导出的数据进行分析,展示代码覆盖率的一个工具。能够和不少的自动构建工具一块儿使用,本文以Travis-CI
为例。
/ ├── src/ │ └── ClassName.php |── tests/ | ├── ClassNameTest/ | | └── ClassNameTest.php | └── Bootstrap.php |── .coveralls.yml |── .travis.yml |── LICENSE |── README.md |── composer.json |── example.php └── phpunit.xml.dist
下面开始具体的配置方法。
若是想更深刻的学习Composer能够查看官方文档(地址在这一节最后)。一个重要的概念就是每个项目都是一个包
注
因此咱们首先须要在项目根目录新建一个composer.json
文件,其中的内容为(稍后咱们再看其中的意思)
{ "name": "jshadowman/package", "description": "this is a test package", "version": "0.0.1", "type": "library", "keywords": [ "database", "logging" ], "license": "MIT", "require": [ "php": ">=5.4.0" ], "require-dev": [ "satooshi/php-coveralls":"*", "phpunit/phpunit": "*" ], "autoload": { "files": [ "./src/ClassName.php" ] } }
name:
这个字段顾名思义,包的名字,应该包含Verdor name(供应商)和Project Name(项目名)。值得注意的是这个字段的值应该都是小写的,这和资源库发布注册有关。具体请参考 Packagist
description:
这个字段应该是这个项目的一个简短的简介。一行便可
type:
项目的类型,可选的值有library
project
metapackage
composer-plugin
具体请参考 Type 中文
require:
咱们的项目依赖于平台软件包
,也就是PHP,PHP的扩展包和一些系统类库。因此咱们在require
之中添加了对PHP的依赖,若是有依赖于其余的包,能够按照这种格式填写。具体请参考 Platform-packages 中文
require-dev:
这个字段列出的依赖只有在测试和开发的时候才会安装,属于额外的依赖。具体请参考 Require-dev 中文
require & require-dev:
这两个字段之下的列表项应该是包名到版本的映射
,其中版本有不少种写法,能够根据需求过滤。具体请参考 Package-Links 中文
autoload:
其中的映射关系设计到PHP命名空间(Name Space)的一些知识,具体请参考 PSR-0 - PSR-4 - PSR0-4_Github
composer.json
中有不少可选的字段和值,编写的规范能够参考Document,中文文档
在项目的根目录新建.coveralls.yml
文件,其中的内容为
coverage_clover: build/logs/clover.xml json_path: build/logs/coveralls-upload.json
coverage_clover:
表示使用指定目录的Clover XML
格式的XML文件,默认指向build/logs/clover.xml
json_path:
用来指定将被上传到Coveralls
网站的json文件,默认指向build/logs/coveralls-upload.json
值得注意的是旧版本所使用的
src_dir
已经在1.0.0版本中被移除了,因此请注意不要使用这个选项
Removed src_dir from CoverallsConfiguration
还有其余的配置选项请参考Github - satooshi/php-coveralls
Coveralls
网站中添加仓库:进入 Coveralls
网站 https://coveralls.io/
点击右上角的 SIGN IN
,在接下来的页面中选择GITHUB SIGN IN
,而后使用本身的Github帐号受权登陆
若是你没使用过Coveralls
的话,登陆成功的界面应该是让你添加一个代码仓库
在ADD REPO
标题下列表中将你的项目从OFF
拨到ON
接下来配置PHPunit
单元测试。
在你的项目根目录新建phpunit.xml.dist
文件,其实这个文件也不必定要新建在根目录,主要记得修改文件内容中的路径就行,不过最好就是根目录和tests文件夹内了。
phpunit.xml.dist
文件的内容为
<phpunit bootstrap="tests/Bootstrap.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" > <testsuites> <testsuite name="Class Test Suite"> <directory>./tests</directory> </testsuite> </testsuites> <filter> <whitelist> <directory>./src</directory> <exclude> <directory>./vendor</directory> <directory>./tests</directory> <file>./example.php</file> </exclude> </whitelist> </filter> <logging> <log type="coverage-clover" target="build/logs/clover.xml"/> <log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/> </logging> </phpunit>
根元素<phpunit>
中的属性
bootstrap
表示在测试运行前先运行一个 "Bootstrap" PHP文件,通常用于配合Composer
中的自动载入,确保不会发生找不到类的状况
colors
表示是否使用彩色输出
convertErrorsToExceptions
PHPUnit 将会安插一个错误处理函数来将错误转换为异常,设置为 false 则表示禁用
convertNoticesToExceptions
此选项设置为 true 时,由 convertErrorsToExceptions 安插的错误处理函数会将 E_NOTICE、E_USER_NOTICE、E_STRICT 错误转换为异常。
convertWarningsToExceptions
此选项设置为 true 时,由 convertErrorsToExceptions 安插的错误处理函数会将 E_WARNING 或 E_USER_WARNING 错误转换为异常。
带有一个或多个 <testsuite>
子元素的 <testsuites>
元素用于多组的测试套件
<filter>
顾名思义,过滤器,对目录下的文件或文件夹进行过滤
<filter>
下的<whitelist>
表示白名单,即须要的部分
<whitelist>
下的<directory>
顾名思义,即须要的目录
<whitelist>
下的<exclude>
这是须要排除的部分,底下的排除项目看标签名就知道了,能够排除目录或者单个文件
最后的<logging>
部分就是日志纪录的内容了。
<log type="coverage-clover" target="build/logs/clover.xml"/>
表示导出coverage-clover
格式的文件,导出文件名为build/logs/clover.xml
<log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/>
表示将日志直接输出到标准输出,即终端上。
完整的XML格式,内容能够参考 XML配置文件
须要注意的是在根元素
<phpunit>
中的属性并非全部都在那个页面介绍的,还有一部分在命令行选项之中,因此若是在附录C找不到,那就去命令行选项(注意根元素属性在命令行选项中是以-
分隔的)那一节找找,确定有的。
使用Github
帐号登陆Travis-CI
Sign Up
点击本身的头像进行我的资料界面,在下面你的项目中,点击你所须要自动构建的项目前的按钮,这个按钮就会变成绿色的勾
在点击到本身的用户信息界面以后,在你的Repo上面会有一个简单的使用介绍,开启Travis-CI是很简单的。
在你的项目根目录新建.travis.yml
文件,其中的内容为
language: php php: - '5.4' - '5.5' - '5.6' - '7.0' before_script: - composer install --prefer-dist --dev --no-interaction script: - mkdir -p build/logs - phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xml after_script: - travis_retry php vendor/bin/coveralls -v
php:
这个底下是自动构建所使用的环境。注意,有固定的格式
before_script:
顾名思义,在正式script
以前运行的脚本(Shell
)命令
script:
开始测试所用的命令
after_script:
在测试结束以后运行的命令,好比用于导出结果到COVERALLS
开始测试以前须要作的准备工做,即安装项目须要的依赖包。
composer install --prefer-dist --dev --no-interaction
这句命令的做用是根据
composer.json
所描述的依赖关系进行依赖的安装,具体请参考 Install 中文
--prefer-dist:
composer 将尽量的从 dist 获取依赖的项目,这将大幅度的加快在 build servers 上的安装
--dev:
安装 require-dev 字段中列出的包
--no-interaction:
不要询问任何交互问题。由于是自动进行依赖安装的,咱们不能手动控制,因此发生任何须要交互的问题,咱们都是处理不了的准备工做作好以后,开始正式的测试工做,首先固然须要先新建一个存放日志的目录
mkdir -p build/logs
这句命令会让系统建立一个连续的目录,若是父目录不存在就先建立父目录
开始进行单元测试并导出代码覆盖率报告
phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xml
这句命令是运行phpunit进行单元测试,具体请参考 PHPUnit - 命令行选项
-c phpunit.xml.dist:
从指定的文件中读取配置信息,这里的配置文件是phpunit.xml.dist
--coverage-clover build/logs/clover.xml:
生成并导出Clover XML
格式的代码覆盖率报告测试完以后接下来就是导出报告到Coveralls了
travis_retry php vendor/bin/coveralls -v
这句命令是实际上是
php vendor/bin/coveralls -v
,前面的travis_retry
的做用是检查后面命令的返回值,若是不是0(返回值为0表示正常结束),那就重复执行3次,若是3次都不为0,那就报错。
php vendor/bin/coveralls -v:
这句命令是使用PHP执行vendor/bin/下的coveralls这个文件,
-v
表示verbose
,即显示详细的报告。
这个命令执行以后就能够在Coveralls
这个网站中看到详细的数据了。
phpunit
执行的结果和coveralls
导出的结果均可以在Travis-CI
的Build Jobs
下看到
接下来就是把这些文件push到Github上,Travis-CI
就会自动构建,而后开始单元测试,并把测试结果中的代码覆盖率发送到Coveralls
。如此,一套流程就结束了。
辛辛苦苦大半天,就是为了展现本身的成绩啊。
因此咱们看到的别人家项目地下这么漂亮的图标咱们也要有啊。
在README.md
文件中添加(注意将如下 Github_ID 替换为本身的 Github-ID,将 Repo_Name 替换为你的项目名字。没有尖括号哦~还有注意区分大小写哦~若是还须要改分支(branch)的话,看到连接你应该也懂吧?我相信你! )
[](https://travis-ci.org/<Github_ID>/<Repo_Name>) [](https://coveralls.io/github/<Github_ID>/<Repo_Name>?branch=master)
其实这些markdown
语句能够直接复制的
Travis-CI:
Build
图标能够在Travis-CI
网站中本身项目名的右边有一个 build:****
的图标,直接点击这个图标,将Image URL
改为Makedown
就能够看到啦
Coveralls:
也是进入本身Repo的详细信息中,中间是LATEST BUILDS
信息,在最右边有一个README BADGE
,底下那个图标右边有个按钮Embed ▾
,点击复制Markdown
的语句便可。
在以为本身的项目开发的差很少时,咱们就可在在Packagist
上发布本身的包啦,发布以后,就能够被别人的项目经过Composer
所依赖~
可使用Github帐号登陆,或者本身注册个帐号登陆,在右上角Sign In
选择是注册仍是使用Github帐号登陆
注册完以后,能够在右上方Submit
中提交一个包,点击Submit
按钮 - Submit
接下来会让你输入Repository URL
,直接输入git://github.com/<Github_ID>/<Repo_Name>
Packagit会在后台clone你的项目,而且检查项目中的composer.json
文件,第一个要检查的就是包的名字,若是包名中有大写的字母,Packagit就会报一个包名不该该有大写字母的错误,因此,这就是上文所说包名最好是小写的来由。
提交以后就能够看到本身的这个包的一些信息了,好比被下载了多少次,被安装了多少次。
回到Github,打开代码仓库的Settings -> Webhooks & services
,而后在Services
右边有个Add Service
的按钮,点击输入查找Packagit
以后会让你输入用户名和Token,这些信息都在你的Packagit
主页中 我的主页
我的主页有个Your API Token
的按钮,按下按钮,就能够看到本身的API TOKEN了,注意保密哦
其中packagist
海油4个小图标,记得替换 PACKAGIST_ID
和 PACKAGE_NAME
哦,不是 Github_ID
和 Repo_Name
哦