PHP 단위 테스트를 수행 할 때 시간 지연 ( Time_Nanosleep )과 관련된 코드는 종종 테스트가 속도가 느려지고 CI/CD 프로세스의 실행 시간을 증가시킵니다. 또한 테스트 자체는 실시간에 의존하여 테스트의 예측 가능성과 안정성을 줄입니다. 효율성을 향상시키고 테스트의 순도를 유지하려면 일반적으로 "모의"와 같은 지연 기능이 필요합니다.
이 기사는 실제로 지연을 도입하지 않고 PHP의 단위 테스트에서 Time_NanoSleep 기능의 동작을 시뮬레이션하는 방법을 설명합니다.
서비스 클래스가 있다고 상상해 보면이 클래스의 방법이 Time_NanoSleep을 사용하여 짧은 지연 작업을 수행 할 것입니다.
class TaskRunner
{
public function runWithDelay(): string
{
time_nanosleep(0, 500000000); // 지연 0.5 두번째
return 'done';
}
}
이 방법을 직접 테스트하면 테스트가 반 초 동안 일시 중지되며, 이는 많은 수의 테스트 시나리오에서 용납 할 수 없습니다. "교체"또는 "재정의" Time_nanoSleep을 찾는 방법을 찾아야합니다.
PHP에는 내장 기능 모의 함수가 없지만 PHP의 기능 검색 메커니즘을 사용할 수 있습니다. 네임 스페이스에서는 전역 기능과 동일한 이름의 함수를 정의하면 네임 스페이스의 함수가 먼저 호출됩니다.
비즈니스 코드를 Gitbox \ Runtime 과 같은 네임 스페이스로 캡슐화합니다.
namespace Gitbox\Runtime;
function time_nanosleep(int $seconds, int $nanoseconds)
{
// 원래 행동:글로벌 기능을 호출합니다
return \time_nanosleep($seconds, $nanoseconds);
}
class TaskRunner
{
public function runWithDelay(): string
{
time_nanosleep(0, 500000000);
return 'done';
}
}
이제 TaskRunner 는 Gitbox \ Runtime \ Time_NanoSleep을 사용하고 있으며 테스트에서 재정의 할 수 있습니다.
테스트 파일에서 동일한 네임 스페이스에서 Mocked Time_NanoSleep 기능을 정의합니다.
namespace Gitbox\Runtime;
function time_nanosleep(int $seconds, int $nanoseconds)
{
// 模拟지연:아무것도하지 않습니다
return true;
}
그런 다음 평소와 같이 테스트 할 수 있습니다.
use Gitbox\Runtime\TaskRunner;
use PHPUnit\Framework\TestCase;
class TaskRunnerTest extends TestCase
{
public function testRunWithDelay()
{
$runner = new TaskRunner();
$result = $runner->runWithDelay();
$this->assertEquals('done', $result);
}
}
테스트 환경에서 Time_NanoSleep을 무시하기 때문에 테스트에는 실질적인 지연이 없습니다.
또 다른 객체 지향적 인 방법은 지연된 작업을 클래스에 캡슐화하고 작업 실행자에 종속성을 주입함으로써 예외 제기, 장기 차단 시뮬레이션 등과 같은 다양한 동작을보다 유연하게 시뮬레이션 할 수 있습니다.
interface SleeperInterface
{
public function sleep(): void;
}
class RealSleeper implements SleeperInterface
{
public function sleep(): void
{
time_nanosleep(0, 500000000);
}
}
class TaskRunner
{
private SleeperInterface $sleeper;
public function __construct(SleeperInterface $sleeper)
{
$this->sleeper = $sleeper;
}
public function runWithDelay(): string
{
$this->sleeper->sleep();
return 'done';
}
}
테스트에서는 모의 클래스를 사용할 수 있습니다.
class FakeSleeper implements SleeperInterface
{
public function sleep(): void
{
// 조치를 취하지 마십시오
}
}
사용 방법 :
$sleeper = new FakeSleeper();
$runner = new \Gitbox\Runtime\TaskRunner($sleeper);
$this->assertEquals('done', $runner->runWithDelay());
PHP에서 시간 의존적 기능을 테스트하는 가장 효율적인 방법은 일반적으로 네임 스페이스를 통해 함수를 재정의하거나 종속성 주입을 사용하는 것입니다. Time_NanoSleep 과 같은 글로벌 기능의 경우 네임 스페이스 다시 쓰기 기술을 사용하고 테스트 로직을 프로젝트의 제어 가능한 경계 내에 유지하는 것이 좋습니다.
또한 인터페이스 및 종속성 주입을 사용하면 코드가보다 유연하고 테스트 가능하며보다 복잡한 시나리오에 적합 할 수 있습니다.
이러한 방법을 통해 실시간 비용을 도입하지 않고 테스트의 시간 지연을 완전히 시뮬레이션하여 테스트 효율과 안정성을 크게 향상시킬 수 있습니다.
보다 관련성이 높은 예제는 https://gitbox.net을 방문하십시오.