TestCases from Source Code

Коллеги, день добрый.

   Сейчас я работаю над "велосипедом", который проходит по коду тестов в формате TestNG и по аннтоациям генерирует описание тестовых случаев. Может быть кто-то уже решал подобную проблему и готов поделиться решением?

 

а чем состоит оригинальная задача?

а вы пробовали javadoc http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html, чтобы неизобретать велосипед?

Михаил, спасибо за "наводку".

Задача стоит такая. Есть тест в TestNG:

@Test

public void test_01 () {

  @TestCase Start Test to check smth.

   CommonPart cp = new CommonPart();

   cp.check(false);

   @TestCase End Test to check smth.

}

Где-то есть класс

public class CommonPart {

  public void check (boolean check) {

     @TestCase Check in Check step 1

      ...

  }

}

Нужно получить что-то вроде:

test_01

1. Start Test to check smth

2. Check in Check step 1

3. End Test to check smth

 

ну это я понял, что вам нужно написать такой код, вопрос зачем? для отчета?

а на каком шаге вы сейчас, и что уже сделали или не можете сделать?

такую задачу можно решить рефлексией

тут надо пользоваться рефлексией, вот эта ссылочка вам пригодиться http://tutorials.jenkov.com/java-reflection/annotations.html#method

 

public class TheClass {
  @MyAnnotation(name="someName",  value = "Hello World")
  public void doSomething(){}
}

и как доступиться к анотации метода

 

Method method = ... //obtain method object
Annotation[] annotations = method.getDeclaredAnnotations();

for(Annotation annotation : annotations){
if(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation = (MyAnnotation) annotation;
System.out.println("name: " + myAnnotation.name());
System.out.println("value: " + myAnnotation.value());
}
}

или же если вам надо доступаться к аннотациям филдов, то вот так вот

 

public class TheClass {

@MyAnnotation(name=“someName”, value = “Hello World”)
public String myField = null;
}

 

Field field = ... //obtain field object
Annotation[] annotations = field.getDeclaredAnnotations();

for(Annotation annotation : annotations){
if(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation = (MyAnnotation) annotation;
System.out.println("name: " + myAnnotation.name());
System.out.println("value: " + myAnnotation.value());
}
}

 

К вопросу о том, зачем мне это - всё очень просто. Есть описание базовых тесткейсов, далее уходим в кодописательство и поддерживать описание кейсов - уже сложно, проще делать метки в коде и генерировать описание. Зачем это делается:

1. Ревью кейсов доступно всей команде, а не только девелоперам.

2. Отчетность.

3. Лёгкость поддержки документации.

4. Функциональный кавередж.

Понятно, что без рефлексии никуда. Просто нужно построить дерево всех вызовов методов из метода @Test, предусмотреть различные варианты. Код пишу в свободное от работы время и временами думаю о том, что все уже сделано до меня.

не думаю что можно что-то найти, может быть можно найти какой-то частный код для какого-то проекта, но я такого не видел

http://stackoverflow.com/questions/4441632/recursively-reading-any-java-object-and-pulling-out-complex-types-into-a-hash-ma

http://stackoverflow.com/questions/8524011/java-reflection-how-can-i-get-the-all-getter-methods-of-a-java-class-and-invoke

 

если люди хотят повысить читабельность тестов

тут или добавляют комментарии, чтобы можно было с помощью javadocs сгенерировать документацию

или уже подключают дополнительный уровень BDD,

где тесты уже показывают что они делают

и где специальные иснтрументы в виде JBehave, Thucydides, автоматечески строят правильные отчеты, чтобы их можно было читать всем

http://wakaleo.com/thucydides-sample-reports/index.html

 

если получиться какое-то решение буду рад увидеть код :)

Спасибо за ссылки, буду думать. На самом деле видел несколько реализаций подобной идеи. Надо смотреть - решать что подходит.

кинь тогда эти пару ссылок сюда, интересно посмотреть

Кое-как нашёл ссылку. Проект Bumblbee: https://code.launchpad.net/~daniel-brolund/bumblebee/main В целом что-то похожее на то, что я хочу:

p, li { white-space: pre-wrap; }

Bumblebee helps you distill available information from executing code (JUnit test cases) to provide human-friendly documentation with minimal effort and intrusion while providing maximum

expressive power, executional power, flexibility and extensibility