programing

문자열에 PHPUnit에 다른 문자열이 포함되어 있는지 테스트하는 방법

goodsources 2022. 10. 20. 21:21
반응형

문자열에 PHPUnit에 다른 문자열이 포함되어 있는지 테스트하는 방법

PHUnit에서 단순히 문자열이 다른 문자열에 포함되어 있는지 테스트하는 어설션을 찾을 수 없습니다.다음과 같은 작업을 시도합니다.

public function testRecipe() {

    $plaintext = get_bread_recipe();

    $this->assertStringContains('flour', $plaintext);

}

어떤 진짜 주장을 내세울까?assertStringContains이 경우 regex는 전혀 필요 없기 때문에 걱정할 필요가 없습니다.

너무 간단해서 뭔가 간과한 게 있을 텐데 도저히 이해가 안 가네요!웃기다assertStringStartsWith()그리고.assertStringEndsWith()!

업데이트: 알고 있습니다.strpos() !== false좀 더 깨끗한 걸 찾고 있어요.만약 내가 바닐라 PHP 함수를 사용한다면 모든 어설션의 요점은 무엇입니까?

아시겠지만assertContains배열에 값이 포함되어 있는지 확인하기 위한 것입니다.

문자열에 서브스트링이 포함되어 있는지 여부를 확인하는 가장 간단한 쿼리는 assertRegexp()를 사용하는 것입니다.

$this->assertRegexp('/flour/', $plaintext);

딜리미터를 추가하면 됩니다.

만약 당신이 정말 갖고 싶다면assertStringContainsassertion, 확장 가능PHPUnit_Framework_TestCase자신만의 것을 만들 수 있습니다.

갱신하다

최신 버전의 PHPUnit에서는assertContains스트링으로 동작합니다.

커스텀 어설션 메서드 내에서는 항상 추악함을 숨길 수 있기 때문에 기본적으로는 재사용 가능한 어설션 라이브러리를 보유하기 위해 사용할 수 있는 phpunit 테스트 케이스에서 상속된 BaseTestCase 클래스가 필요합니다(http://xunitpatterns.com/Custom%20Assertion.html) 참조).(php 5.4에서는 imho 어설션 라이브러리는 특성이 실제로 도움이 되는 경우 중 하나입니다.)저는 항상 제 프로젝트에서 상당히 많은 사용자 정의 주장을 도입합니다. 종종 도메인마다 다릅니다.네, 못생긴 것도 있습니다:) 음, 그래서 캡슐화가 있는 것 같아요.그 중에서도...:)

업데이트: 방금 확인했는데, 'assert Contains'와 'assert Not Contains'는 문자열 및 어레이(및 'Traversable'을 구현하는 모든 항목)에서도 작동합니다.

function test_Contains()
{
    $this->assertContains("test", "this is a test string" );
    $this->assertNotContains("tst", "this is a test string");
}

2019 및 PHPUnit 8.0 업데이트

assertContains()는 PHPUnit 8.0 이후 권장되지 않습니다(문제 번호 3425 참조).


다음으로 특정 방법을 권장합니다( 참조).

$plaintext = 'I fell on the flour';
$this->assertStringContainsString('flour', $plaintext);

힌트: RectorPHPUnit 8.0을 설정하면 즉시 업그레이드 할 수 있습니다.

Vanilla PHP 함수를 포함한 모든 것에 대해 단언할 수 있습니다.테스트하고 있는 문자열에서 관심 있는 서브스트링의 스트포스가 FALSE를 반환하지 않는다고 단언하면 요구를 충족시킬 수 있습니다.

단, 0과 같이 FALSE로 평가되는 것이 아니라 FALSE에 대해 체크하고 있는지 확인하십시오(테스트 대상 문자열이 지정된 하위 문자열로 시작하는 경우 strpos가 반환됩니다).

@Schleis에서 확장하면 더 복잡한 문자열이 있는 경우 regex를 이스케이프해야 합니다.

$this->assertRegexp('/' . preg_quote('[some $stuff]') . '/', $plaintext);

또는 보다 깔끔한 방법으로 정리합니다.

public function assertStringContains($needle, $haystack)
{
    $this->assertRegexp('/' . preg_quote($needle) . '/', $haystack);
}

사용할 수 있는 일반 PHP 함수를 사용하여 문자열 내의 문자열을 수행한 후 assertEqual로 출력할 수 없습니까?네, 반짝이지는 않지만 효과가 있어요.

또는 assert를 사용할 수 있습니다.그건 규칙적인 표현으로.

이 예제의 제한된 관점에서 보면 코드/테스트 설계에 본질적으로 문제가 있는 것 같습니다.함수가 길이를 알 수 없는 복잡한 문자열을 반환하고 문자열에 예상 비트가 'something'인 이유는 무엇입니까?

테스트에서는 입력을 제어할 수 있어야 하므로 예상되는 출력 문자열 전체를 알아야 합니다.만약 당신의 기능이 문자열의 다른 부분을 망가뜨린다면, 이 주장만으로는 알 수 없습니다.그렇기 때문에 assertStringContains 함수는 존재하지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/24015943/how-to-test-if-string-contains-another-string-in-phpunit

반응형