PHPUnit:使用 dbunit 或其他任何工具在功能测试期间修改数据库条目
PHPUnit: Modify database entry during functional tests using dbunit or anything else
我是一名学生,对 php 还很陌生。对于我的实践教育,我需要在一个大项目上使用 PHPUnit 编写功能测试。在过去的 3 天里,我一直在尝试在 PHPUnit 测试期间使用数据库。例如,我已经为用户注册到网站并登录进行了测试。但问题是当用户注册时我必须激活它们。我设法使用爬虫来激活,但如果我可以访问数据库、进行查询而不是继续进行测试,那会容易得多。即使不包括这个,我也想创建一个模拟(我相信这就是它的名字)并且只是 运行 数据库中的测试,这样我就不必使用爬虫和很长的路要以管理员身份登录并手动删除用户。
我不够熟练,不知道如何解决这个任务。我尝试安装 dbUnit 并阅读教程。但是当我尝试使用它时,我没有设法完成任何事情。使用 SetUp() 和 TearDown() 也不起作用。
以下是我在 Whosebug 上找到的链接,其中的问题与我的类似:
- 这家伙对爬虫的使用和我差不多,但是不懂解决方法。
Phpunit testing with database
-这里的答案很好,这就是我决定获取dbunit的地方。但是由于我缺乏理解,我无法用它做任何事情。
无论如何,这是我的代码(去掉了,因为我有 500 行爬虫在网站上爬行)我 运行将所有测试集中在一个 class 中,就好像它们是 运行 一个接一个我可以按照注册,登录和删除的过程。如果我能够知道如何在生活之间使用数据库交互会容易得多。
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Doctrine\ORM\EntityRepository;
use PHPUnit_Extensions_Database_TestCase_Trait;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Doctrine\Common\Persistence\ObjectManager;
use PDO;
use Doctrine\ORM\Mapping as ORM;
class LoginRegistroTest extends WebTestCase
{
+public function testUserRegisterFail()
+public function testUserRegister() //check if new user can be registered and this also writes the user to the database
+public function testAdminLogin() //this uses the website admin panel and crawler to login and find the registered user and change Active from 0 to 1.
+public function testLoginFail()
+public function testUserLogin() //check if new user can login
+public function testUserDelete() //delete the user created for testing - again using the website admin panel and admin account.
}
编辑:这是我想使用的代码,但我不知道如何执行查询。请注意最后我想更改用户名的地方。
/**
* @var \Doctrine\ORM\EntityManager
*/
private $em;
/**
* {@inheritDoc}
*/
protected function setUp()
{
self::bootKernel();
$this->em = static::$kernel->getContainer()
->get('doctrine')
->getManager();
}
public function testUserRegister() //check if new artista can be registered
{
$client = static::createClient();
$crawler=$client->request('GET', "/");
// Create a new client to browse the application
$link = $crawler->filter('a:contains("Regístrate")')->eq(0)->link();
$crawler = $client->click($link);
// var_dump($crawler->html());
$this->assertEquals(1, $crawler->filter('h1:contains("REGISTRO")')->count());
$buttonCrawlerNode = $crawler->selectButton("Entra");
$form = $buttonCrawlerNode->form();
$crawler->filter('#registro_category option:contains("Usuario")');
$form['frontendbundle_artista[nombre]'] = 'Test404';
$form['frontendbundle_artista[apellidos]'] = 'Test404';
$form['frontendbundle_artista[email]'] = 'Test404@gmail.com';
$form['frontendbundle_artista[password][first]'] = 'Test404';
$form['frontendbundle_artista[password][second]'] = 'Test404';
$form['frontendbundle_artista[condiciones]'] ->tick();
// submit the form
$client->followRedirects();
$crawler = $client->submit($form);
$this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET ");
$this->assertTrue($crawler->filter('body:contains("Test404@gmail.com")')->count() >= 1 ); //if user was created this will be true
$this->em
->CreateQuery('UPDATE usuario SET nombre = \'Alfred Schmidt\' WHERE UsuarioID = 2106;')
;
$client->getResponse()->getContent();
}
这是我能够解决所有问题的方法:
$em = $client->getContainer()->get('doctrine.orm.entity_manager');
$nombre = 'Test405';
$usuario =$em->getRepository('AppBundle:usuario')->findOneByNombre($nombre);
$em->remove($usuario);
$em->flush();
我是一名学生,对 php 还很陌生。对于我的实践教育,我需要在一个大项目上使用 PHPUnit 编写功能测试。在过去的 3 天里,我一直在尝试在 PHPUnit 测试期间使用数据库。例如,我已经为用户注册到网站并登录进行了测试。但问题是当用户注册时我必须激活它们。我设法使用爬虫来激活,但如果我可以访问数据库、进行查询而不是继续进行测试,那会容易得多。即使不包括这个,我也想创建一个模拟(我相信这就是它的名字)并且只是 运行 数据库中的测试,这样我就不必使用爬虫和很长的路要以管理员身份登录并手动删除用户。
我不够熟练,不知道如何解决这个任务。我尝试安装 dbUnit 并阅读教程。但是当我尝试使用它时,我没有设法完成任何事情。使用 SetUp() 和 TearDown() 也不起作用。
以下是我在 Whosebug 上找到的链接,其中的问题与我的类似:
无论如何,这是我的代码(去掉了,因为我有 500 行爬虫在网站上爬行)我 运行将所有测试集中在一个 class 中,就好像它们是 运行 一个接一个我可以按照注册,登录和删除的过程。如果我能够知道如何在生活之间使用数据库交互会容易得多。
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Doctrine\ORM\EntityRepository;
use PHPUnit_Extensions_Database_TestCase_Trait;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Doctrine\Common\Persistence\ObjectManager;
use PDO;
use Doctrine\ORM\Mapping as ORM;
class LoginRegistroTest extends WebTestCase
{
+public function testUserRegisterFail()
+public function testUserRegister() //check if new user can be registered and this also writes the user to the database
+public function testAdminLogin() //this uses the website admin panel and crawler to login and find the registered user and change Active from 0 to 1.
+public function testLoginFail()
+public function testUserLogin() //check if new user can login
+public function testUserDelete() //delete the user created for testing - again using the website admin panel and admin account.
}
编辑:这是我想使用的代码,但我不知道如何执行查询。请注意最后我想更改用户名的地方。
/**
* @var \Doctrine\ORM\EntityManager
*/
private $em;
/**
* {@inheritDoc}
*/
protected function setUp()
{
self::bootKernel();
$this->em = static::$kernel->getContainer()
->get('doctrine')
->getManager();
}
public function testUserRegister() //check if new artista can be registered
{
$client = static::createClient();
$crawler=$client->request('GET', "/");
// Create a new client to browse the application
$link = $crawler->filter('a:contains("Regístrate")')->eq(0)->link();
$crawler = $client->click($link);
// var_dump($crawler->html());
$this->assertEquals(1, $crawler->filter('h1:contains("REGISTRO")')->count());
$buttonCrawlerNode = $crawler->selectButton("Entra");
$form = $buttonCrawlerNode->form();
$crawler->filter('#registro_category option:contains("Usuario")');
$form['frontendbundle_artista[nombre]'] = 'Test404';
$form['frontendbundle_artista[apellidos]'] = 'Test404';
$form['frontendbundle_artista[email]'] = 'Test404@gmail.com';
$form['frontendbundle_artista[password][first]'] = 'Test404';
$form['frontendbundle_artista[password][second]'] = 'Test404';
$form['frontendbundle_artista[condiciones]'] ->tick();
// submit the form
$client->followRedirects();
$crawler = $client->submit($form);
$this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET ");
$this->assertTrue($crawler->filter('body:contains("Test404@gmail.com")')->count() >= 1 ); //if user was created this will be true
$this->em
->CreateQuery('UPDATE usuario SET nombre = \'Alfred Schmidt\' WHERE UsuarioID = 2106;')
;
$client->getResponse()->getContent();
}
这是我能够解决所有问题的方法:
$em = $client->getContainer()->get('doctrine.orm.entity_manager');
$nombre = 'Test405';
$usuario =$em->getRepository('AppBundle:usuario')->findOneByNombre($nombre);
$em->remove($usuario);
$em->flush();