찾다
백엔드 개발PHP 튜토리얼【持续集成你的项目】为你的项目创建自动化测试和代码覆盖率测试

本文以PHP项目作为例子所需要拥有(准备)的:

  • Github账号

  • 一个项目

看着篇幅挺大的,难免有什么遗漏,如果文中有错误的地方,还请各位斧正!谢谢。因为本来篇幅就大,所以就没配图了,如果有很多人反馈看不懂或者失败了,我再后期补下图。谢谢!

Travis-CI

项目为保证项目始终处于健康稳定的状态,我们需要一个可以持续的自动的对贡献的代码进行自动化测试的服务。

Travis-CI就是在这样的背景下于2011年开启服务,到现在为止已经有超过300k个开源项目和235k的用户在使用。

Travis-CI所做的工作就是自动在虚拟机中运行 .travis.yml中设定的内容进行单元测试,生成并导出报告。

Composer

开源项目之间一般有着相互依赖的关系,比如项目A的一个组件依赖于另一个项目B。当这种依赖关系多了之后就需要一个管理依赖的工具。

Composer就是PHP的一个 依赖管理工具。它允许你申明项目所依赖的代码库,并且会在你的项目中安装他们。 Composer中文

Packagist

Packagist is the main Composer repository. It aggregates public PHP packages installable with Composer.

这个网站是主要的Composer仓库,通过Composer发布的项目,所储存的仓库就是这个网站,这也是Composer安装依赖的下载来源。 可以使用Github账号登录

登录之后可以提交自己的项目,不过需要项目中有 composer.json文件,这在之后进行介绍。

Coveralls

单元测试中,代码覆盖率经常被用来衡量测试好坏的指标。

所谓的代码覆盖率简单的说就是在运行完测试用例之后,走过了多少句的代码,比如说,你要测试的一个函数有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可以查看官方文档(地址在这一节最后)。一个重要的概念就是 每一个项目都是一个包 注

所以我们首先需要在 项目根目录新建一个 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:这个字段应该是这个项目的一个简短的简介。一行即可

  • version:项目的版本,并不是必须的, 而且建议忽略,具体请参考 Version 中文

  • type:项目的类型,可选的值有 library project metapackage composer-plugin具体请参考 Type 中文

  • keywords:用于在被搜索时的关键字,可以是一个数组 Keywords 中文

  • license:项目发布所使用的开源协议,可选的值请参考 License 中文

  • require:这表示项目所依赖的软件包列表,除非这些依赖被满足,否则不会完成安装。 Require 中文

  • require:我们的项目依赖于 平台软件包,也就是PHP,PHP的扩展包和一些系统类库。所以我们在 require之中添加了对PHP的依赖,如果有依赖于其他的包,可以按照这种格式填写。具体请参考 Platform-packages 中文

  • require-dev:这个字段列出的依赖只有在测试和开发的时候才会安装,属于额外的依赖。具体请参考 Require-dev 中文

  • require & require-dev:这两个字段之下的列表项应该是 包名到版本的映射,其中版本有很多种写法,可以根据需求过滤。具体请参考 Package-Links 中文

  • autoload:表示的是 autoloader的自动加载映射。具体请参考 Autoload 中文

  • autoload:其中的映射关系设计到PHP命名空间(Name Space)的一些知识,具体请参考 PSR-0- PSR-4- PSR0-4_Github

composer.json中有很多可选的字段和值,编写的规范可以参考 Document, 中文文档

Coveralls

在项目的 根目录新建 .coveralls.yml文件,其中的内容为

coverage_clover: build/logs/clover.xmljson_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

在你的 项目根目录新建 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>
  • 根元素 中的属性

    • bootstrap表示在测试运行前先运行一个 "Bootstrap" PHP文件,一般用于配合 Composer中的自动载入,确保不会发生找不到类的情况

    • colors表示是否使用彩色输出

    • convertErrorsToExceptionsPHPUnit 将会安插一个错误处理函数来将错误转换为异常,设置为 false 则表示禁用

    • convertNoticesToExceptions此选项设置为 true 时,由 convertErrorsToExceptions 安插的错误处理函数会将 E_NOTICE、E_USER_NOTICE、E_STRICT 错误转换为异常。

    • convertWarningsToExceptions此选项设置为 true 时,由 convertErrorsToExceptions 安插的错误处理函数会将 E_WARNING 或 E_USER_WARNING 错误转换为异常。

  • 带有一个或多个 子元素的 元素用于多组的测试套件

  • 顾名思义,过滤器,对目录下的文件或文件夹进行过滤

  • 下的 表示白名单,即需要的部分

  • 下的 顾名思义,即需要的目录

  • 下的 这是需要排除的部分,底下的排除项目看标签名就知道了,可以排除目录或者单个文件

  • 最后的 部分就是日志纪录的内容了。

    • 表示导出 coverage-clover格式的文件,导出文件名为 build/logs/clover.xml

    • 表示将日志直接输出到标准输出,即终端上。

完整的XML格式,内容可以参考 XML配置文件

需要注意的是在根元素 中的属性并不是所有都在那个页面介绍的,还有一部分在 命令行选项之中,所以如果在附录C找不到,那就去命令行选项(注意根元素属性在命令行选项中是以 -分隔的)那一节找找,肯定有的。

Travis-CI

  • 使用 Github账号登录 Travis-CI Sign Up

  • 点击自己的头像进行个人资料界面,在下面你的项目中,点击你所需要自动构建的项目前的按钮,这个按钮就会变成绿色的勾

  • 在点击到自己的用户信息界面之后,在你的Repo上面会有一个简单的使用介绍,开启Travis-CI是很简单的。

在你的 项目根目录新建 .travis.yml文件,其中的内容为

language: phpphp:  - '5.4'  - '5.5'  - '5.6'  - '7.0'before_script:  - composer install --prefer-dist --dev --no-interactionscript:  - mkdir -p build/logs  - phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xmlafter_script:  - travis_retry php vendor/bin/coveralls -v
  • language:顾名思义,这就是你项目所用的语言,所支持的语言和格式可以查阅 Document, 配置PHP

  • 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下看到

git push

接下来就是把这些文件push到Github上, Travis-CI就会自动构建,然后开始单元测试,并把测试结果中的代码覆盖率发送到 Coveralls。如此,一套流程就结束了。

展示

辛辛苦苦大半天,就是为了展示自己的成绩啊。所以我们看到的别人家项目地下这么漂亮的图标我们也要有啊。

在 README.md文件中添加( 注意将以下 Github_ID 替换为自己的 Github-ID,将 Repo_Name 替换为你的项目名字。没有尖括号哦~还有注意区分大小写哦~如果还需要改分支(branch)的话,看到链接你应该也懂吧?我相信你!)

[![Build Status](https://travis-ci.org/<Github_ID>/<Repo_Name>.svg?branch=master)](https://travis-ci.org/<Github_ID>/<Repo_Name>)[![Coverage Status](https://coveralls.io/repos/github/<Github_ID>/<Repo_Name>/badge.svg?branch=master)](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(可选)

在觉得自己的项目开发的差不多时,我们就可在在 Packagist上发布自己的包啦,发布之后,就可以被别人的项目通过 Composer所依赖~

  • 可以使用Github账号登录,或者自己注册个账号登录,在右上角 Sign In选择是注册还是使用Github账号登录

  • 注册完之后,可以在右上方 Submit中提交一个包,点击 Submit按钮 - Submit

  • 接下来会让你输入 Repository URL,直接输入 git://github.com//

  • 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哦

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 세션이 실패 할 수있는 몇 가지 일반적인 문제는 무엇입니까?PHP 세션이 실패 할 수있는 몇 가지 일반적인 문제는 무엇입니까?Apr 25, 2025 am 12:16 AM

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP의 세션 관련 문제를 어떻게 디버그합니까?PHP의 세션 관련 문제를 어떻게 디버그합니까?Apr 25, 2025 am 12:12 AM

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

session_start ()가 여러 번 호출되면 어떻게됩니까?session_start ()가 여러 번 호출되면 어떻게됩니까?Apr 25, 2025 am 12:06 AM

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

PHP에서 세션 수명을 어떻게 구성합니까?PHP에서 세션 수명을 어떻게 구성합니까?Apr 25, 2025 am 12:05 AM

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기