Определение тестовых данных для кода Java - просто - возможно, с использованием Scala? - PullRequest
2 голосов
/ 23 июня 2011

Можно ли определить некоторые тестовые данные для java-программы таким образом, чтобы она была легко читаемой человеком и программно разбиралась в соответствующие вызовы функций и элементы данных.Если это невозможно сделать в Java, я готов использовать Scala для этого.Тестируемый код - это код Java, который не будет перенесен в Scala.

    interface someInterface {
        class X {
            // the member variables will always either 
            // be enums or intrinsic types 
            private int a;
            public int a() { return this.a; };
            public void a(int a) {this.a = a; };

            private double b;
            public double b() { return this.b; };
            public void b(double b) {this.b = b; };

            private String c;
            public String c() { return this.c; };
            public void c(String c) {this.c = c; };
        }

        enum A {
            A_1,
            A_2
        }
        class Y {
            // assume setters and getters as per X above
            private A a;
            private double b;
            private String c;
            private Z[] z;
        }
        class Z {
            private int a;
            private double b;
            private String c;
        }

        Y function1(X x, String s);
    }

    public void boo() {
        String[] testData = {
            /* how can I specify this array so that 
               coo(...) can be called as below
               would I be better off defining this 
               test code in Scala?
               the classes and interfaces above: 
               someInterface, A, X, Y and Z are in Java 
               and will not be ported to Scala */
        };
        coo(testData);
    }

    public void coo(String[] testData) {
        /* this function will know how to:
               a) parse testData
               b) use reflection to call 
                  someInterface.functionXXX with parameters
                  as specified in testData
               c) construct the return result as specified 
                  in testData and compare against actual 
                  return result */
    }   
}

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Вы можете использовать JUnit 4 для этого и запускать с классом Parameterized.

Создайте тестовый класс следующим образом:

@RunWith(Parameterized.class)
public class MyTest
{
      private String s;
      private SomeInterface.X x;
      private SomeInterface someInterface;

      @Parameters
      public static Collection<Object[]> prepareData()
      {
            Collection<Object[]> args = new ArrayList<Object[]>();

            args.add(new Object[]{"org.some.thing.Impl",  1, 2.6,"Hello", "World"});
            args.add(new Object[]{"org.some.thing.Impl",  2, 2.7,"Goodbye", "World"});
            args.add(new Object[]{"org.some.thing.Impl",  3, 2.8,"Hello", "Universe"});
            args.add(new Object[]{"org.some.thing.Impl2", 4, 2.9,"Goodbye", "Universe"});

            return args;        
      }

      public MyTest(Object[] args)
      {
            String someInterfaceImplementation = args[0].toString();

            someInterface = null;

            int a = (Integer) args[1];
            double b = (Double) args[2];
            String c = (String) args[3];

            s = (String) args[4];

            x = new SomeInterface.X();
            x.a(a);
            x.b(b);
            x.c(c);
      }

      @Test
      public void testSomething()
      {
            someInterface.function1(x, s);
      }
 }

Расширение:

@RunWith(Parameterized.class) указывает платформе JUnit запустить запросить у класса тестирования параметры и выполнить весь тест в классе с этими параметрами.
Ожидается Collection из Object[].Каждый Object[] передается через отражение в конструктор этого класса.

prepareData - предоставляет все сценарии, которые вы хотите проверить.

MyTest(Object[] args) заполняет члены этого класса до того, какзапуск всех тестов по определенному набору параметров.Важно отметить, что someInterface инициализируется только один раз - для каждого набора параметров.Если вы добавите больше тестов для того же набора параметров, вам может понадобиться повторно инициализировать его.

testSomething() запустит ваш тест.Он будет запускаться один раз в Object[], что обеспечивает prepareData.И он гарантированно запустится после того, как MyTest(Object[] args) будет выполнено (да, у вас есть альтернатива здесь)

1 голос
/ 23 июня 2011

Я бы посмотрел на YAML (версия Java snakeYaml ), чтобы сохранить ваши внешние тестовые данные. Одна из его основных целей - читаемость человеком. Перечисления и javabeans могут быть довольно легко определены в yaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...