programing

JUnit에서 regex 일치 항목 확인

procenter 2022. 12. 9. 22:14
반응형

JUnit에서 regex 일치 항목 확인

루비즈Test::Unit멋지다assert_matches단위 테스트에서 사용할 수 있는 메서드를 사용하여 정규식이 문자열과 일치함을 확인할 수 있습니다.

JUnit에도 이런 게 있나요?현재는 다음과 같이 하고 있습니다.

assertEquals(true, actual.matches(expectedRegex));

사용하시는 경우assertThat()정규식을 테스트하는 Hamcrest Matcher를 사용하면 어설션이 실패하면 예상되는 패턴과 실제 텍스트를 나타내는 멋진 메시지가 나타납니다.그 주장은 더 유창하게 읽힐 것이다.

assertThat("FooBarBaz", matchesPattern("^Foo"));

Hamcrest 2를 사용하면matchesPattern에 있어서의 방법MatchesPattern.matchesPattern.

내가 아는 바로는 다른 방법이 없어.확인을 위해 javadoc assert를 확인했습니다.하지만 아주 작은 변화일 뿐입니다.

assertTrue(actual.matches(expectedRegex));

편집: Pholser의 답변 이후 햄크레스트 매처스를 사용하고 있습니다. 그것도 확인해 보세요!

Hamcrest를 사용할 수 있지만 직접 Matcher를 작성해야 합니다.

public class RegexMatcher extends TypeSafeMatcher<String> {

    private final String regex;

    public RegexMatcher(final String regex) {
        this.regex = regex;
    }

    @Override
    public void describeTo(final Description description) {
        description.appendText("matches regex=`" + regex + "`");
    }

    @Override
    public boolean matchesSafely(final String string) {
        return string.matches(regex);
    }


    public static RegexMatcher matchesRegex(final String regex) {
        return new RegexMatcher(regex);
    }
}

사용.

import org.junit.Assert;


Assert.assertThat("test", RegexMatcher.matchesRegex(".*est");

Hamcrest 및 jcabi 매처를 사용할 수 있습니다.

import static com.jcabi.matchers.RegexMatchers.matchesPattern;
import static org.junit.Assert.assertThat;
assertThat("test", matchesPattern("[a-z]+"));

자세한 내용은 이쪽: 정규 표현 햄크레스트 매처스.

classpath에는 다음 2개의 의존관계가 필요합니다.

<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest-core</artifactId>
  <version>1.3</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-matchers</artifactId>
  <version>1.3</version>
  <scope>test</scope>
</dependency>

저도 이 기능을 찾고 있었기 때문에 GitHub에서 regex-tester라는 프로젝트를 시작했습니다.Java 정규식을 쉽게 테스트할 수 있는 라이브러리입니다(현재 JUnit에서만 사용 가능).

지금은 도서관이 매우 한정되어 있지만, 햄크레스트 매처는 이렇게 작동합니다.

assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));

regex-tester 사용 방법에 대한 자세한 내용은 여기를 참조하십시오.

Ralph의 구현과 유사한 매처가 공식 Java Hamcrest 매처 라이브러리에 추가되었습니다.아쉽게도 릴리즈 패키지는 아직 제공되지 않습니다.수업은 GitHub에서 볼 수 있습니다.

assertj를 사용하는 또 다른 대안.이 접근방식은 패턴 객체를 직접 전달할 수 있기 때문에 좋습니다.

import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));

Hamcrest에 대응하는 matcher: org.hamcrest가 있습니다.Matchers.matchesPattern(String regex).

Hamcrest의 개발이 지연되고 있기 때문에 최신 버전 1.3을 사용할 수 없습니다.

testCompile("org.hamcrest:hamcrest-library:1.3")

대신 새로운 개발 시리즈를 사용해야 합니다(2015년 1월 이전).

testCompile("org.hamcrest:java-hamcrest:2.0.0.0")

또는 그 이상:

configurations {
    testCompile.exclude group: "org.hamcrest", module: "hamcrest-core"
    testCompile.exclude group: "org.hamcrest", module: "hamcrest-library"
}
dependencies {
    testCompile("org.hamcrest:hamcrest-junit:2.0.0.0")
}

테스트 중:

Assert.assertThat("123456", Matchers.matchesPattern("^[0-9]+$"));


JUnit은 아니지만 fest-assert의 다른 방법은 다음과 같습니다.

assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);

JUnit 5 업데이트(추가 라이브러리 없음)

이제 사용할 수 있습니다.assertLinesMatchhttps://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html#assertLinesMatch-java.util.List-java.util.List- 에서 설명하고 있는 바와 같이

이 어설션은 여러 줄의 텍스트와 일치하도록 작성되었으므로,List한 줄만 맞추려고 해도.예:

assertLinesMatch(List.of("Expected at the beginning.*"), List.of(contentUnderTest));

어설션 알고리즘은 정확한 일치를 시도하고 실패하면String.match기대치를 정규 표현으로 해석합니다.

중요한 주의사항: 고객님의contentUnderTest여러 행이 포함되어 있습니다..*정규식이 작동하지 않습니다(.는 기본적으로는 새 행 문자와 일치하지 않으므로 삽입 플래그를 추가해야 할 수 있습니다(https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#DOTALL):

// Flag ?s means match new lines
assertLinesMatch(List.of("(?s)Expected at the beginning.*"), List.of(contentWithMultipleLines));

언급URL : https://stackoverflow.com/questions/8505153/assert-regex-matches-in-junit

반응형