특정 순서로 PHPUnit 테스트 실행
이 테스트의 내부에서는TestCase
어떤 순서로 실행할 수 있을까요?예를 들어 오브젝트의 라이프 사이클을 작성에서 사용, 파기까지 구분하고 싶은데 다른 테스트를 실행하기 전에 오브젝트가 먼저 설정되어 있는지 확인해야 합니다.
PHPUnit은 @depends 주석을 통해 테스트 종속성을 지원합니다.
다음으로 의존관계를 충족하는 순서로 테스트가 실행되고 각 종속 테스트가 인수를 다음으로 전달하는 예를 나타냅니다.
class StackTest extends PHPUnit_Framework_TestCase
{
public function testEmpty()
{
$stack = array();
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
다만, 의존 관계가 해결되지 않은 테스트는 실행되지 않는 것에 주의해 주세요(이것에 의해서, 불합격의 테스트에 대한 주의가 신속히 이루어지기 때문에 바람직합니다).따라서 의존관계를 사용할 때는 세심한 주의를 기울이는 것이 중요합니다.
아마도 당신의 테스트에 설계상의 문제가 있는 것 같습니다.
일반적으로 각 검정은 다른 검정에 의존해서는 안 되며 임의의 순서로 실행할 수 있습니다.
각 테스트는 실행에 필요한 모든 것을 인스턴스화 및 파기해야 합니다.이것은 완벽한 접근법입니다.테스트 사이에 오브젝트와 상태를 공유하지 마십시오.
왜 N 테스트에 같은 오브젝트가 필요한지 좀 더 구체적으로 말씀해 주시겠습니까?
이에 대한 정답은 테스트에 적합한 구성 파일입니다.같은 문제가 발생하여 필요한 테스트 파일 오더로 테스트 슈트를 생성하여 수정하였습니다.
phpunit.xml:
<phpunit
colors="true"
bootstrap="./tests/bootstrap.php"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
strict="true"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
stopOnRisky="false"
>
<testsuites>
<testsuite name="Your tests">
<file>file1</file> //this will be run before file2
<file>file2</file> //this depends on file1
</testsuite>
</testsuites>
</phpunit>
테스트에서 다양한 도우미 개체와 설정을 공유하려면setUp()
,tearDown()
추가하다sharedFixture
소유물.
PHPUnit에서는 종속 테스트 케이스를 지정하고 종속 테스트 케이스 간에 인수를 전달할 수 있는 '@depends' 주석을 사용할 수 있습니다.
대체 솔루션:테스트에서 static(!) 함수를 사용하여 재사용 가능한 요소를 만듭니다.예를 들어 (Selenium IDE를 사용하여 테스트를 기록하고 phpunit-selenium(github)을 사용하여 브라우저 내에서 테스트를 실행합니다.)
class LoginTest extends SeleniumClearTestCase
{
public function testAdminLogin()
{
self::adminLogin($this);
}
public function testLogout()
{
self::adminLogin($this);
self::logout($this);
}
public static function adminLogin($t)
{
self::login($t, 'john.smith@gmail.com', 'pAs$w0rd');
$t->assertEquals('John Smith', $t->getText('css=span.hidden-xs'));
}
// @source LoginTest.se
public static function login($t, $login, $pass)
{
$t->open('/');
$t->click("xpath=(//a[contains(text(),'Log In')])[2]");
$t->waitForPageToLoad('30000');
$t->type('name=email', $login);
$t->type('name=password', $pass);
$t->click("//button[@type='submit']");
$t->waitForPageToLoad('30000');
}
// @source LogoutTest.se
public static function logout($t)
{
$t->click('css=span.hidden-xs');
$t->click('link=Logout');
$t->waitForPageToLoad('30000');
$t->assertEquals('PANEL', $t->getText("xpath=(//a[contains(text(),'Panel')])[2]"));
}
}
이제 이 재사용 가능한 요소를 다른 테스트에서 사용할 수 있습니다.예를 들어 다음과 같습니다.
class ChangeBlogTitleTest extends SeleniumClearTestCase
{
public function testAddBlogTitle()
{
self::addBlogTitle($this,'I like my boobies');
self::cleanAddBlogTitle();
}
public static function addBlogTitle($t,$title) {
LoginTest::adminLogin($t);
$t->click('link=ChangeTitle');
...
$t->type('name=blog-title', $title);
LoginTest::logout($t);
LoginTest::login($t, 'paris@gmail.com','hilton');
$t->screenshot(); // take some photos :)
$t->assertEquals($title, $t->getText('...'));
}
public static function cleanAddBlogTitle() {
$lastTitle = BlogTitlesHistory::orderBy('id')->first();
$lastTitle->delete();
}
- 이 방법으로 테스트 계층을 구축할 수 있습니다.
- 각 테스트 케이스가 완전히 분리된 특성을 스틸로 유지할 수 있습니다(각 테스트 후 DB를 청소하는 경우).
- 그리고 가장 중요한 것은 예를 들어 향후 로그인 변경 방법에서 LoginTest 클래스만 수정하고 다른 테스트에서는 올바른 로그인 부분이 필요하지 않은 경우입니다(LoginTest 업데이트 후 작동합니다).
테스트를 실행하면 스크립트가 시작되고 DB가 정리됩니다.에 나는 나의 그위 my my my를 한다.SeleniumClearTestCase
입니다.MigrationToSelenium2
(github) selenium(selenium)을 사용하여 된 포트 로)IDE + f "Selenium IDE: PHP Formatters" ide ide 、 Laravel Test Case ( Iluminate ) 。 \기\ \테스트 중\를 .Test Case) PPUnit_Framework_' Case)시때의 입니다.Test Case)는 테스트 종료 시 DB를 청소할 때 Larabel이 웅변어에 액세스할 수 있도록 설정합니다.PHPUnit_Extensions_Selenium2입니다. allustic 함수의 Larabel allustic에서 호출됨)에도.CreateApplication(SeleniumClearTestCase에서 호출됨)입니다.setUp
TestCase)에서
내가 보기에 특정 리소스의 생성 및 파괴를 테스트해야 하는 다음과 같은 시나리오를 사용하십시오.
처음에는 a.testCreateResource와 b.testDestroyResource의 두 가지 메서드가 있었습니다.
a. test Create Resource
<?php
$app->createResource('resource');
$this->assertTrue($app->hasResource('resource'));
?>
b. test Destroy Resource
<?php
$app->destroyResource('resource');
$this->assertFalse($app->hasResource('resource'));
?>
testDestroyResource는 testCreateResource에 의존하기 때문에 이는 잘못된 생각이라고 생각합니다.그리고 더 좋은 방법은
a. test Create Resource
<?php
$app->createResource('resource');
$this->assertTrue($app->hasResource('resource'));
$app->deleteResource('resource');
?>
b. test Destroy Resource
<?php
$app->createResource('resource');
$app->destroyResource('resource');
$this->assertFalse($app->hasResource('resource'));
?>
특정 순서로 실행할 필요가 있는 경우 테스트에 문제가 있습니다.각 테스트는 서로 완전히 독립되어 있어야 합니다.결함 현지화에 도움이 되고 반복 가능한(따라서 디버깅 가능한) 결과를 얻을 수 있습니다.
이 사이트에서 이러한 문제를 회피하기 위한 테스트의 계수화 방법에 대한 아이디어/정보를 확인하시기 바랍니다.
언급URL : https://stackoverflow.com/questions/10228/run-phpunit-tests-in-certain-order
'programing' 카테고리의 다른 글
GROUP BY를 사용하여 각 그룹의 최신 레코드를 얻는 방법은 무엇입니까? (0) | 2022.12.27 |
---|---|
WSO2 API Manager 1.10은 Maria를 지원합니까?DB (0) | 2022.12.27 |
php의 플로트 비교 (0) | 2022.12.27 |
Javascript에서 난수 생성기 시드하기 (0) | 2022.12.27 |
MySQL - 일대일 관계 (0) | 2022.12.27 |