Правило JQassistant для TestMethodWithoutAssertion с не-Junit методами assert - PullRequest
0 голосов
/ 27 апреля 2018

Наш проект использует assert методы из библиотеки assertj, а также в некоторых методах модульного тестирования. Таким образом, текущее правило шифра для поиска метода assert не идентифицирует методы assert, как показано ниже, и помечает их как нарушения.

assertThat ( "х") isEqualTo ( "Y"). в методах модульного тестирования.

как изменить скрипт, чтобы он учитывал любые вызовы "assert *" из метода модульного теста.

      <cypher><![CDATA[
        MATCH
            (c:Type:Class)-[:DECLARES]->(m:Method:JunitTestMethod),
            (m)-[:INVOKES*..10]->(assert:Method)
        WHERE
            assert.signature =~ "void assert.*"
            OR assert.signature =~ "void fail.*"
            OR assert.signature =~ "void verify.*"

        SET
            m:JunitTestWithAssert
        RETURN
            c.fqn AS TestClass, m.name AS TestMethodWithAssert
        ]]></cypher>

Образец метода испытаний:

        @Test
        public void testAssertWithDiffLibrary() {
          String testName = "Hello";
          assertThat(testName).isEqualTo("Hello");
         }

Примечание. Попытка добавить предложение where "OR assert.name = ~". assert."", но не обнаруживает эти утверждения.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Взгляните на демонстрационное приложение Spring PetClinic: оно предоставляет концепцию assertj: AssertMethod в assertj.adoc :

[[assertj:AssertMethod]]
[source,cypher,role=concept]
.Mark all assertThat methods of 'org.assertj.core.api.Assertions' with "AssertJ" and "Assert".
----
MATCH
  (assertType:Type)-[:DECLARES]->(assertMethod)
WHERE
  assertType.fqn = 'org.assertj.core.api.Assertions'
  and assertMethod.signature =~ '.* assertThat.*'
SET
  assertMethod:AssertJ:Assert
RETURN
  assertMethod
----

, на который затем ссылается ограничение в test.adoc :

[[test:TestMethodWithoutAssertion]]
[source,cypher,role=constraint,requiresConcepts="junit4:TestMethod,assertj:AssertMethod,spring-test-web:Assert"]
.All test methods must perform at least one assertion (within a call hierarchy of max. 3 steps).
----
MATCH
  (testType:Test:Type)-[:DECLARES]->(testMethod:Test:Method)
WHERE
  NOT (testMethod)-[:INVOKES*..3]->(:Method:Assert)
RETURN
  testType AS DeclaringType,
  testMethod AS Method
----
0 голосов
/ 27 апреля 2018

Было бы

"OR assert.name =~ ".*assert.*"" 

Но он имеет тот недостаток, что каждый метод, содержащий assert в имени, помечен. Обратите внимание на звезды после точек.

Учитывая, что вы хотите использовать предоставленное ограничение "junit4: TestMethodWithoutAssertion", я бы предложил версию AssertJ концепции http://buschmais.github.io/jqassistant/doc/1.3.0/#junit4:AssertMethod:

<concept id="assertj:AssertMethod">
    <description>Labels all assertion methods declared by org.assertj.core.api.Assertions with "Assertj" and "Assert".</description>
    <cypher><![CDATA[
        MATCH
                (assertType:Type)-[:DECLARES]->(assertMethod)
            WHERE
            assertType.fqn = 'org.assertj.core.api.Assertions'
            and assertMethod.signature =~ '.*assertThat.*'
        SET
        assertMethod:Assertj:Assert
        RETURN
                assertMethod
        ]]></cypher>
</concept>

Итак, определение вашей группы теперь выглядит следующим образом:

<group id="default">
    <includeConcept refId="assertj:AssertMethod" />
    <includeConstraint refId="junit4:TestMethodWithoutAssertion" />
</group>

Теперь предоставленный вами пример метода обработан правильно.

...