我正在使用Symfony 2.8(最新)的Web應用程序,其中可以單獨使用/重用的應用程序的每個部分都是自己的軟件包。例如,有一個NewsBundle,GalleryBundle,ContactBundle,AdminBundle(這是一個特例 - 它只是EasyAdminBundle收集特定包所提供特徵的包裝包),UserBundle(用於存儲用戶實體和模板的FOSUserBundle子包)PHPUnit測試分離
我的問題基本上是,單元測試最好的結構是什麼?
讓我再解釋一下:在我的UserBundle中,我想對我的FOSUserBundle實現進行測試。我有一個測試登錄頁面(通過HTTP狀態碼),登錄失敗(通過錯誤消息),登錄成功(通過特定的代碼元素),記住我(通過Cookie),註銷(通過頁面-content)
<?php
namespace myNamespace\Admin\UserBundle\Tests;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* Class FOSUserBundleIntegrationTest.
*/
class FOSUserBundleIntegrationTest extends WebTestCase
{
/**
* Tests the login, login "remember-me" and logout-functionality.
*/
public function testLoginLogout()
{
// Get client && enable to follow redirects
$client = self::createClient();
$client->followRedirects();
// Request login-page
$crawler = $client->request('GET', '/admin/login');
// Check http status-code, form && input-items
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertEquals(1, $crawler->filter('form[action="/admin/login_check"]')->count());
$this->assertEquals(1, $crawler->filter('input[name="_username"]')->count());
$this->assertEquals(1, $crawler->filter('input[name="_password"]')->count());
$this->assertEquals(1, $crawler->filter('input[type="submit"]')->count());
// Clone client and crawler to have the old one as template
$clientLogin = clone $client;
$crawlerLogin = clone $crawler;
// Get form
$formLogin = $crawlerLogin->selectButton('_submit')->form();
// Set wrong user-data
$formLogin['_username'] = 'test';
$formLogin['_password'] = '123';
// Submit form
$crawlerLoginFailure = $clientLogin->submit($formLogin);
// Check for error-div
$this->assertEquals(1, $crawlerLoginFailure->filter('div[class="alert alert-error"]')->count());
// Set correct user-data
$formLogin['_username'] = 'mmustermann';
$formLogin['_password'] = 'test';
// Submit form
$crawlerLoginSuccess = $client->submit($formLogin);
// Check for specific
$this->assertTrue(strpos($crawlerLoginSuccess->filter('body')->attr('class'), 'easyadmin') !== false ? true : false);
$this->assertEquals(1, $crawlerLoginSuccess->filter('li[class="user user-menu"]:contains("Max Mustermann")')->count());
$this->assertEquals(1, $crawlerLoginSuccess->filter('aside[class="main-sidebar"]')->count());
$this->assertEquals(1, $crawlerLoginSuccess->filter('div[class="content-wrapper"]')->count());
// Clone client from template
$clientRememberMe = clone $client;
$crawlerRememberMe = clone $crawler;
// Get form
$formRememberMe = $crawlerRememberMe->selectButton('_submit')->form();
// Set wrong user-data
$formRememberMe['_username'] = 'mmustermann';
$formRememberMe['_password'] = 'test';
$formRememberMe['_remember_me'] = 'on';
// Submit form
$crawlerRememberMe = $clientRememberMe->submit($formRememberMe);
// Check for cookie
$this->assertTrue($clientRememberMe->getCookieJar()->get('REMEMBERME') != null ? true : false);
// Loop all links on page
foreach ($crawlerRememberMe->filter('a')->links() as $link) {
// Check for logout in uri
if (strrpos($link->getUri(), 'logout') !== false) {
// Set logout-link
$logoutLink = $link;
// Leave loop
break;
}
}
// Reuse client to test logout-link
$logoutCrawler = $clientRememberMe->click($logoutLink);
// Get new client && crawl default-page
$defaultPageClient = self::createClient();
$defaultPageCrawler = $defaultPageClient->request('GET', '/');
// Check http status-code, compare body-content
$this->assertTrue($defaultPageClient->getResponse()->isSuccessful());
$this->assertTrue($logoutCrawler->filter('body')->text() == $defaultPageCrawler->filter('body')->text());
}
}
所有這些測試將在一個方法來完成,因爲如果我在不同的方法做,我將有一個高的量(5×4行= 20行復制重複的代碼粘貼&)。這是否遵循最佳實踐?分離單元測試的最佳做法是什麼? (或其他措辭:你會怎麼做?)
問題的第二部分:是否有可能爲測試類或類似的工作提供幫助函數?我的意思是提供登錄客戶端的方法。這將用於管理功能測試。
爲什麼評價如此糟糕?我能做些什麼來改善我的問題? – SebTM
因爲這個問題非常廣泛,主要是基於意見的,並且沒有明確的答案。你會想要一些更具體的問題,以及你嘗試過的一些代碼示例。 –
我已經添加了當前的代碼並更新了文本。你說得對,這可能是基於意見的,但我沒有找到關於如何管理代碼的「最佳實踐」。這將有助於我從社區體驗中受益,因爲這裏有許多專業開發人員。 – SebTM