>  기사  >  백엔드 개발  >  Laravel 데이터베이스 테스트를 수행하는 또 다른 방법(SQLite)

Laravel 데이터베이스 테스트를 수행하는 또 다른 방법(SQLite)

不言
不言원래의
2018-07-13 15:21:323034검색

이 글에서는 Laravel 데이터베이스 테스트(SQLite)를 수행하는 또 다른 방법을 주로 소개합니다. 이제 이를 공유합니다. 필요한 친구들이 참고할 수 있습니다.

Laravel 데이터베이스 테스트

테스트 측면에서 >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.phpconnections数组中添加一个新的数据库连接

'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>

참조: 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 새 데이터베이스 연결 추가🎜
rrreee🎜 여기서 매우 중요한 매개변수는 'database' => ':memory:'입니다. :memory:데이터베이스는 SQLite에 내장된 메모리 내 데이터베이스입니다. 테스트 케이스가 실행될 때마다 메모리에 새 데이터베이스가 생성되고 실행 후 자동으로 지워집니다. 테스트가 완료되고 데이터베이스 연결이 종료됩니다. 메모리에 있기 때문에 매우 빠르며 테스트에 매우 편리합니다. > 데이터베이스를 테스트 라이브러리로 사용합니다. 자세한 설명을 보려면 여기를 클릭하세요. 🎜
  • 🎜그런 다음 PHPUnit의 구성 파일을 수정해야 합니다. phpunit.xml에서 데이터베이스를 변경하세요. 연결 방금 정의한 SQLite 연결🎜
rrreee🎜이렇게 하면 .env에 정의된 <code>DB_CONNECTION=mysql 데이터베이스 연결을 덮어쓰게 됩니다. code> , 테스트를 실행할 때 mysql 연결 대신 sqlite 연결을 사용하도록 프레임워크에 지시합니다. 🎜
  • 🎜마지막으로 테스트 케이스를 실행하기 전에 데이터베이스 마이그레이션을 수행해야 합니다. TestCase.php라는 테스트 클래스의 기본 클래스에 <code> >setUp method🎜
rrreee🎜 이러한 방식으로 각 테스트 사례가 실행되기 전에 :memory: 데이터베이스에 추가됩니다. SQLite의 모든 마이그레이션을 수행하고 비즈니스 로직에 필요한 데이터 테이블을 생성합니다. 🎜🎜솔루션의 장점과 단점🎜
  • 🎜이 솔루션의 핵심은 SQLite에 내장된 메모리 데이터베이스를 사용한다는 것입니다. :memory:이므로 상대적으로 빠르고 격리성이 뛰어나며 개발 데이터베이스에 아무런 영향을 미치지 않습니다. 🎜
  • 🎜물론 이 솔루션에도 단점이 있습니다. 프로젝트 데이터베이스가 거대하고 데이터 테이블이나 마이그레이션 파일이 많으면 테스트를 실행할 때 많은 메모리를 소비하게 됩니다. 메모리 부족으로 인해 테스트가 중단될 수 있습니다. 이때, PHP에 적절한 메모리를 할당해야 합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.