IT박스

문자열에 PHPUnit의 다른 문자열이 포함되어 있는지 테스트하는 방법은 무엇입니까?

itboxs 2020. 12. 7. 07:57
반응형

문자열에 PHPUnit의 다른 문자열이 포함되어 있는지 테스트하는 방법은 무엇입니까?


문자열이 다른 문자열에 포함되어 있는지 테스트하는 PHPUnit 에서 어설 션을 찾을 수없는 것 같습니다 . 다음과 같이 시도하십시오.

public function testRecipe() {

    $plaintext = get_bread_recipe();

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

}

대신에 어떤 진짜 주장을 assertStringContains할까요? 이 경우 정규식이 전혀 필요하지 않기 때문에 정규식에 대해 걱정할 필요가 없습니다.

너무 간단해서 내가 간과 한 것이있을 것 같지만 알아낼 수 없습니다! 충분히 재미 assertStringStartsWith()있고 assertStringEndsWith()!

업데이트 :strpos() !== false 사용할 수 있다는 것을 알고 있지만 더 깨끗한 것을 찾고 있습니다. 어쨌든 바닐라 PHP 함수를 사용한다면 모든 주장의 요점은 무엇입니까?


알 수 있듯이 assertContains배열에 값이 포함되어 있는지 확인하는 것입니다.

문자열에 하위 문자열이 포함되어 있는지 확인하려면 가장 간단한 쿼리는 assertRegexp () 를 사용하는 것입니다.

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

구분 기호 만 추가하면됩니다.

정말로 assertStringContains어설 션 을 갖고 싶다면 자신의 어설 션을 확장 PHPUnit_Framework_TestCase하고 생성 할 수 있습니다.

최신 정보

최신 버전의 PHPUnit에서는 assertContains문자열에서 작동합니다.


사용자 지정 어설 ​​션 메서드 내에서 추악함을 항상 숨길 수 있으므로 기본적으로 재사용 가능한 어설 션 라이브러리를 사용하는 데 사용할 수있는 phpunit 테스트 케이스에서 상속되는 BaseTestCase 클래스가 있습니다 ( http://xunitpatterns.com/Custom 참조) . % 20Assertion.html ) .. (php 5.4에서는 트레이 트도 사용할 수 있습니다. imho assertion 라이브러리는 트레이 트 가 실제로 유용한 경우 중 하나입니다.) .. 저는 항상 제 프로젝트에 몇 가지 사용자 지정 어설 ​​션을 소개합니다. 그리고 예, 일부는 추악합니다.) 음, 캡슐화가 필요한 것 같아요 ... 무엇보다도 ... :)

업데이트 : 방금 확인하고 'assertContains'와 'assertNotContains'는 실제로 문자열뿐만 아니라 배열 (및 '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를 참조하세요 .


이제 특정 방법이 권장됩니다 (참조 issue #3422).

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

사용 가능한 일반 PHP 함수를 사용하여 문자열의 문자열을 수행 한 다음 assertEquals 그 출력을 수행 할 수 없습니까? 물론, 빛이 나지는 않지만 작동합니다.

또는 정규식과 함께 assertThat을 사용할 수 있습니다.

예제의 제한된 관점에서 볼 때 코드 / 테스트 디자인에 본질적으로 잘못된 것 같습니다. 함수가 길이를 알 수없는 복잡한 문자열을 반환하는 이유는 문자열에서 예상되는 비트가 '어딘가'인 이유는 무엇입니까?

테스트에서 입력을 제어 할 수 있어야하므로 예상되는 전체 출력 문자열을 알아야합니다. 함수가 문자열의 다른 부분을 망친다면이 단언은 그것에 대해 알려주지 않을 것입니다. 이것이 assertStringContains 함수가 존재하지 않는 이유 일 것입니다.


바닐라 PHP 함수를 포함하여 모든 것에 대해 단언을 할 수 있습니다. 테스트하려는 문자열에서 관심이있는 하위 문자열에 대한 strpos가 FALSE를 반환하지 않는다고 주장하면 요구 사항을 충족 할 것입니다.

그래도 FALSE에 대해 확인하고 0과 같이 FALSE로 평가되는 항목이 아닌지 확인하십시오 (테스트중인 문자열이 주어진 하위 문자열로 시작하는 경우 strpos가 반환하는 것입니다).


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

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

또는 깔끔한 방법으로 마무리하십시오.

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

if (strpos($plaintext, 'flour') === false){
   $this->fail("planintext should contain 'flour'");
}

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

반응형