基于 Laravel 开发博客应用系列 —— 从测试开始(一):创建项目和PHPUnit
1、创建博客项目
我们将遵循上一节提到的六步创建一个新 Laravel 5.1 项目的步骤,创建本节要用到的博客项目 —— blog。
首先,在本地主机安装应用骨架:
nonfu@ubuntu:~/Code$ composer create-project laravel/laravel blog --prefer-dist
接下来,编辑 Homestead.yaml,添加站点信息及数据库信息:
sites:
- map: test.app
to: /home/vagrant/Code/test/public
- map: blog.app
to: /home/vagrant/Code/blog/public databases;
- homestead
- blog
然后运行 homestead provision 重新启动 Homestead 虚拟机。
在本地主机中,添加如下这行到 hosts 文件:
192.168.10.10 blog.app
还是在本地主机中,运行如下命令本地安装 NPM 包:
nonfu@ubuntu:~/Code$ cd blog
nonfu@ubuntu:~/Code/blog$ sudo npm install
然后到数据库中创建本项目的数据库 blog,之后编辑.env文件,修改数据库名称:
// 将
DB_DATABASE=homestead // 修改为
DB_DATABASE=blog
最后在浏览器中访问 http://blog.app 查看一切是否就绪。
2、运行 PHPUnit
Laravel 5.1 集成的单元测试(基于 PHPUnit)功能是开箱即用的,甚至还提供了一个简单的单元测试示例以确保使用 web 请求该应用是否返回期望的 200 响应状态码。
要运行 PHPUnit,在项目根目录下简单运行 phpunit 命令即可:

如果执行 phpunit 命令报错:command not found 或者 permissions denied,前者可能是安装时有问题,phpunit命令位于 Composer 安装目录下的 vendor/bin 目录中,而且该目录已经被添加到系统路径中;后者则是因为没有为phpunit 设置正确的权限以致无权执行该命令。
要解决这两个问题,需要按以下步骤操作:
第一步——删除项目的 vendor 目录。
第二步——在项目根目录下使用 composer update 命令重新生成 vendor 目录。
注:以上步骤都在主机操作系统中操作,而不是在 Homestead 虚拟机中。
好了,就是这样,重新执行 phpunit 命令看看一切是否正常
Laravel 5.1 中的 PHPUnit 配置
在新创建的 Laravel 5.1 项目根目录下有一个 phpunit.xml 文件,该文件包含了 PHPUnit 的配置项。
查看 phpunit.xml 文件会看到测试文件位于 tests 目录下,该目录下默认已经有两个测试文件了:
ExampleTest.php—— 包含一个testBasicExample()测试,ExampleTest继承自TestCase。TestCase.php—— Laravel 测试类的基类。
下面我们来看看 ExampleTest.php 中的 testBasicExample() 方法:
public function testBasicExample()
{
$this->visit('/')->see('Laravel 5');
}
该测试会访问应用首页并查看页面是否包含 Laravel 5,还有比这更简单的测试实现吗?!
TestCase 类提供了很多针对 Laravel 5.1 应用的方法和属性用于单元测试,此外还提供了很多断言方法和 Crawler 类型的测试。下面让我们来一一探究。
Laravel 5.1 中 Crawler 测试的方法和属性
Crawler 意为(网络)爬虫,Crawler 测试允许你在 web 应用中测试页面访问。
下面是一些 Crawler 测试中常用的属性和方法:
$this->response:web应用返回的最后一个响应
$this->currentUri:当前访问的URL
visit($uri):通过GET请求访问给定URI
get($uri, array $headers = []):通过GET请求获取给定URI页面的内容,可以传递请求头信息(可选)
post($uri, array $data = [], array $headers = []):提交POST请求到给定URI
put($uri, array $data = [], array $headers = []):提交PUT请求到给定URI
patch($uri, array $data = [], array $headers = []):提交PATCH请求到给定URI
delete($uri, array $data = [], array $headers = []):提交DELETE请求到给定URI
followRedirects():根据最后响应进行任意重定向
see($text, $negate = false):断言给定文本在页面中是否出现
seeJson(array $data = null):断言响应中是否包含JSON,如果传递了$data,还要断言包含的JSON是否与给定的匹配
seeStatusCode($status):断言响应是否包含期望的状态码
seePageIs($uri):断言当前页面是否与给定URI匹配
seeOnPage($uri)和landOn($uri):seePageIs()的别名
click($name):使用给定body、name或者id点击链接
type($text, $element):使用给定文本填充输入框
check($element):检查页面上的checkbox复选框
select($option, $element):选择页面上下拉列表的某个选项
attach($absolutePath, $element):上传文件到表单
press($buttonText):通过使用给定文本的按钮提交表单
withoutMiddleware():在测试中不使用中间件
dump():输出最后一个响应返回的内容
Laravel 5.1 提供给 PHPUnit 的方法和属性
下面是 Laravel 5.1 提供给 PHPUnit 使用的应用方法和属性:
$app:Laravel 5.1 应用实例
$code:Artisan命令返回的最后一个码值
refreshApplication():刷新应用。该操作由TestCase的setup()方法自动调用
call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null):调用给定URI并返回响应
callSecure($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null):调用给定HTTPS URI并返回响应
action($method, $action, $wildcards = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null):调用控制器动作并返回响应
route($method, $name, $routeParameters = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null):调用命名路由并返回响应
instance($abstract, $object):在容器中注册对象实例
expectsEvents($events):指定被给定操作触发的事件列表
withoutEvents():无需触发事件模拟事件调度
expectsJobs($jobs):为特定操作执行被调度的任务列表
withSession(array $data):设置session到给定数组
flushSession():清空当前session中的内容
startSession():开启应用Session
actingAs($user):为应用设置当前登录用户
be($user):为应用设置当前登录用户
seeInDatabase($table, array $data, $connection = null):断言给定where条件在数据库中存在
notSeeInDatabase($table, $array $data, $connection = null):断言给定where条件在数据库中不存在
missingFromDatabase($table, array $data, $connection = null):notSeeInDatabase()的别名
seed():填充数据库
artisan($command, $parameters = []):执行Artisan命令并返回码值
上述这些方法和属性都可以在测试类中使用。
Laravel 5.1 中 PHPUnit 的断言方法
除了标准的 PHPUnit 断言方法(如 assertEquals()、assertContains()、assertInstanceOf() 等)之外,Laravel 5.1 还提供了很多额外的断言用于帮助编写 web 应用的测试用例:
assertPageLoaded($uri, $message = null):断言最后被加载的页面;如果加载失败抛出异常:$uri/$message
assertResponseOk():断言客户端返回的响应状态码是否是200
assertReponseStatus($code):断言客户端返回的响应状态码是否和给定码值相匹配
assertViewHas($key, $value = null):断言响应视图包含给定数据片段
assertViewHasAll($bindings):断言视图包含给定数据列表
assertViewMissing($key):断言响应视图不包含给定数据片段
assertRedirectedTo($uri, $with = []):断言客户端是否重定向到给定URI
assertRedirectedToRoute($name, $parameters = [], $with = []):断言客户端是否重定向到给定路由
assertRedirectedToAction($name, $parameters = [], $with = []):断言客户端是否重定向到给定动作
assertSessionHas($key, $value = null):断言session包含给定键/值
assertSessionHasAll($bindings):断言session包含给定值列表
assertSessionHasErrors($bindings = []):断言session包含绑定错误
assertHasOldInput():断言session中包含上一次输入
关于测试方法的使用示例,可参考 Laravel 测试文档,下一节我们将继续探讨测试使用:如何使用Gulp进行TDD(测试驱动开发)。
基于 Laravel 开发博客应用系列 —— 从测试开始(一):创建项目和PHPUnit的更多相关文章
- 基于 Laravel 开发博客应用系列 —— 从测试开始(二):使用Gulp实现自动化测试
3.使用 Gulp 进行 TDD(测试驱动开发) Gulp 是一个使用 JavaScript 编写的自动化构建工具.用于对前端通用任务(如最小化.压缩.编译)进行自动构建.Gulp 还可以用来监控源代 ...
- 基于 Laravel 开发博客应用系列 —— 设置 Windows 本地开发环境
1.安装原生PHP 下载/解压 PHP 到 PHP 下载页下载最新版本的 PHP(如果使用 Laravel 5.1 的话需要 PHP 5.5.9+ 版本),解压下载的zip格式压缩文件到本地目录,比如 ...
- 基于Laravel开发博客应用系列 —— 十分钟搭建博客系统
1.创建文章数据表及其模型(0:00~2:30) 我们已经在上一节中为博客项目完成了大部分准备工作,现在首先要做的就是为这个项目创建一个新的文章表 posts及该表对应的模型类 Post,使用如下Ar ...
- 基于Laravel开发博客应用系列 —— 构建博客后台管理系统
一个完整的博客应用不能没有后台管理系统.所以在本节中我们将继续完善博客应用 —— 开发后台管理系统. 1.创建路由 在上一节十分钟创建博客项目中,已经设置过了 app/Http/routes.php, ...
- 基于 Laravel 开发博客应用系列 —— 项目必备软件安装
1.概述 通过本项目我们将会构建一个简单.清爽.优雅的博客系统,以及维护管理该博客的后台. 本项目源码公开在GitHub上:https://github.com/ChuckHeintzelman/l5 ...
- 基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源
本节我们将讨论如何将前端资源集成到项目中,包括前端资源的发布和引入.本项目将使用 Bower 和 Gulp 下载和集成jQuery.Bootstrap.Font Awesome 以及 DataTabl ...
- 基于 Laravel 开发博客应用系列 —— Homestead 和 Laravel 安装器
1.Homestead 从主机操作系统的控制台中(Windows 中被称作命令提示符,Linux 中被称作终端),你可以轻松通过不带参数的homestead 命令查看所有有效的 Homestead 命 ...
- 基于 Laravel 开发博客应用系列 —— 设置 Linux/Mac 本地开发环境
1.不同 Linux 发行版本的区别 不同的 Linux 发行版本之间有一些细微区别,尤其是包管理器:CentOS 和 Fedora 使用 yum 作为包管理器,而Ubuntu 使用 apt,在 O ...
- 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 ... 基于. ...
随机推荐
- Java并发编程原理与实战三十二:ForkJoin框架详解
1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...
- Tomcat设置编码问题
为了解决编码问题,在tomcat的server.xml文件中添加了useBodyEncodingForURI="true"配置,如下 <Connector port=&quo ...
- kdissert:linux下的自由脑图软件
----------------------------------------------------作者: 吉庆 email: jiqingwu@gmail.commainpage: http ...
- 外卖(food) & 洛谷4040宅男计划 三分套二分&贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 Si ...
- tensorflow环境安装
tensorflow环境安装1.安装虚拟机Virtrualbox下载地址:https://www.virtualbox.org/wiki/Downloads 2.下载安装Ubuntu镜像下载地址:ht ...
- Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- Spring4笔记10--SSH整合1--Spring与Hibernate整合
SSH 框架整合技术: 1. Spring与Hibernate整合(对比Spring与JDBC模板): Service业务层代码和测试类都不变,添加实体类的映射配置文件: <?xml versi ...
- Awk基础
Awk文本处理 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.awk数据可以来自标准输入.一个或多个文件,或其它命令的输出.awk通常是配合脚本进行使用, 是一个强大的文本处 ...
- 在Mac上搭建ReactNative开发环境
1.安装Homebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr/bin/ruby -e "$(curl -fsSL https://raw.g ...
- 打开mvc项目无法运行,报"Unable to launch the IIS Express Web server"
今天遇到一个问题,打开asp.net mvc 项目,右击浏览器运行,无法运行... 提示下面错误, 解决方案: 删除项目文件夹下的 .vs 文件夹,然后重新打开项目运行即可 参考:http://www ...