이 글에서는 Laravel 데이터베이스 테스트(SQLite)를 수행하는 또 다른 방법을 주로 소개합니다. 이제 이를 공유합니다. 필요한 친구들이 참고할 수 있습니다.
테스트 측면에서 >Laravel에 내장된 PHPUnit
사용은 매우 편리한 솔루션을 제공합니다. 데이터베이스 추가, 삭제, 수정, 쿼리 테스트를 위해 해결해야 할 매우 중요한 문제는 테스트가 완료된 후 데이터베이스의 원래 모습을 어떻게 복원할 것인가 하는 것입니다. 예를 들어, 사용자 등록 방법, 사용자 기록을 테스트합니다. 데이터베이스에 삽입해야 하지만 테스트가 완료된 후에는 이 테스트 사례가 데이터베이스에 저장되는 것을 원하지 않습니다. 이 문제를 해결하기 위해 Laravel
은 매우 편리한 솔루션을 제공합니다: Laravel
内置使用PHPUnit
提供了非常方便的解决方案。而对于数据库增删改查的测试,要解决的一个很重要的问题就是如何在测试完成之后,恢复数据库的原貌,例如要测试一个用户注册的方法,需要插入一条用户记录到数据库,但是测试完成之后,我们并不想让这条测试用例保存在数据库里。为了解决这个问题,Laravel
提供了非常方便的方案:
使用迁移:DatabaseMigrations
使用事务:DatabaseTransactions
参考资料:https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test
SQLite
的内存数据库:memory:
Laravel
提供的两种解决方案,仍然对数据库进行了读写操作,某些时候你可能并不想这样(例如多人共享一个线上开发数据库),此时,还可以用一种更为优雅的方式:SQLlite
,逻辑其实也非常简单:就是在跑测试用例的时候,将数据库的连接替换为SQLite
。
例如我们有以下测试类(该事例并不具有代表性,仅用于说明问题,并假设本机已经安装SQLite
):
class HomePageTest extends TestCase { public function testHomePage() { // 创建一个测试用户,并保存 $user = factory(App\User::class)->create(); $this->actingAs($user)->visit('/home')->see('Dashboard'); } }
首先在Laravel
的数据库配置文件,即config/database.php
的connections
数组中添加一个新的数据库连接
'sqlite' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ],
这里一个非常重要的参数就是'database' => ':memory:'
,:memory:
数据库是SQLite
中内置的一个内存数据库,每次运行测试用例的时候都会在内存中创建一个新的数据库,并在测试完成关闭数据库连接后,自动清除掉,具有良好的隔离性,又因为是在内存中的,所以速度也很快,这些特性对于测试非常方便,这也是我们选用SQLite
数据库作为测试库的一个非常重要的原因。有关详细解释,点击这里。
然后需要修改PHPUnit
的配置文件,在phpunit.xml
中,将数据库连接改为刚刚定义的SQLite
连接
<php> <env name="APP_ENV" value="testing"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> <!-- 将数据库连接改为刚刚定义的SQLite连接 --> <env name="DB_CONNECTION" value="sqlite" /> </php>
这会覆盖.env
中定义的数据库连接DB_CONNECTION=mysql
,并告诉框架在运行测试的时候,用sqlite
连接代替mysql
连接。
最后需要在运行测试用例之前执行数据库迁移,在测试类的基类,即TestCase.php
中添加setUp
方法
public function setUp() { parent::setUp(); // 执行数据库迁移 $this->artisan('migrate'); }
这样在每次执行测试用例之前,都会向SQLite
的:memory:
数据库中执行所有的迁移,生成业务逻辑所需的数据表。
该方案关键点在于使用SQLite
内置的一个内存数据库:memory:
,因此速度比较快,有很好的隔离性,也不会对我们的开发数据库有任何的影响。
当然该方案也有缺点,假如项目的数据库庞大,有大量的数据表或者迁移文件,会消耗大量内存,当运行测试的时候可能会由于内存不足,导致测试中断。此时需要为PHP分配合适的内存,在php.ini
中修改配置memory_limit = 128M
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
<a title="如何解决Laravel.log 文件写入的问题" href="http://www.php.cn/php-weizijiaocheng-406465.html" target="_blank">如何解决Laravel.log 文件写入的问题</a>
DatabaseMigrations
DatabaseTransactions
참조: https://laravel.com/docs/5.3/database-testing#resetting -the-database-after-each-test
SQLite
의 메모리 내 데이터베이스 :memory:
Laravel에서 제공하는 두 가지 솔루션은 여전히 데이터베이스에서 읽기 및 쓰기 작업을 수행합니다. 때로는 이 작업을 수행하고 싶지 않을 수도 있습니다(예: 여러 사람이 온라인 개발 데이터베이스를 공유하는 경우). 방법: <code>SQLlite
, 논리는 실제로 매우 간단합니다. 테스트 사례를 실행할 때 데이터베이스 연결을 SQLite
로 바꾸세요. 사용 예
SQLite
가 이 컴퓨터에 설치되었다고 가정합니다): 🎜rrreee Laravel
의 데이터베이스 구성 파일, 즉 의 <code>connections
배열에 있습니다. config/database.php 새 데이터베이스 연결 추가🎜'database' => ':memory:'
입니다. :memory:데이터베이스는 SQLite
에 내장된 메모리 내 데이터베이스입니다. 테스트 케이스가 실행될 때마다 메모리에 새 데이터베이스가 생성되고 실행 후 자동으로 지워집니다. 테스트가 완료되고 데이터베이스 연결이 종료됩니다. 메모리에 있기 때문에 매우 빠르며 테스트에 매우 편리합니다. > 데이터베이스를 테스트 라이브러리로 사용합니다. 자세한 설명을 보려면 여기를 클릭하세요. 🎜PHPUnit
의 구성 파일을 수정해야 합니다. phpunit.xml
에서 데이터베이스를 변경하세요. 연결 방금 정의한 SQLite
연결🎜.env에 정의된 <code>DB_CONNECTION=mysql
데이터베이스 연결을 덮어쓰게 됩니다. code> , 테스트를 실행할 때 mysql
연결 대신 sqlite
연결을 사용하도록 프레임워크에 지시합니다. 🎜TestCase.php라는 테스트 클래스의 기본 클래스에 <code> >setUp
method🎜
:memory:
데이터베이스에 추가됩니다. SQLite
의 모든 마이그레이션을 수행하고 비즈니스 로직에 필요한 데이터 테이블을 생성합니다. 🎜🎜솔루션의 장점과 단점🎜SQLite
에 내장된 메모리 데이터베이스를 사용한다는 것입니다. :memory:
이므로 상대적으로 빠르고 격리성이 뛰어나며 개발 데이터베이스에 아무런 영향을 미치지 않습니다. 🎜php.ini
에서 memory_limit = 128M 구성을 수정하세요. 위 내용이 이 글의 전체 내용이기를 바랍니다. 모두의 학습에 도움이 됩니다. 더 많은 관련 내용을 보시려면 PHP 중국어 홈페이지를 주목해주세요! 🎜🎜관련 권장사항: 🎜🎜<code><a title="Laravel.log 파일 작성 문제를 해결하는 방법" href="http://www.php.cn/php-weizijiaocheng-406465.html" target=" _blank">Laravel.log 파일 작성 문제 해결 방법🎜</a>
🎜🎜🎜Laravel 개발 환경 배포 농가 설치 및 구성 프로세스(Windows 시스템)🎜🎜🎜🎜🎜Laravel 라우팅(라우터) 상세 그래픽 및 텍스트 설명🎜🎜
위 내용은 Laravel 데이터베이스 테스트를 수행하는 또 다른 방법(SQLite)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!