Как протестировать программу в Java с помощью заранее введенных тестов?
Тестирование программ
Сообщений 1 страница 4 из 4
Поделиться22007-11-16 17:33:16
Одним из методов тестирования является так называемое юнит-тестирование. При этом тестируется функционал отдельных классов.
Что бы протестировать задачу проще всего вынести непосредственно решение в отделный метод, входными параметрами в который передать заранее считанные входные данные. Например возьмем стандартную задачку A+B:
import java.util.Scanner;
public class APlusBSample {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println(solve(s.nextInt(),s.nextInt()));
}
public static int solve(int a, int b) {
return a+b;
}
}
У нас есть метод solve, в который параметрами отдаются все входные данные, а выходные данные метод возвращает. Метод обязательно должен быть public, чтобы он был доступен в тестах. Так же желательно сделать его статическим (static) - это позволит вызывать его в тестах не создавая экземпляра класса APlusBSample.
Теперь как создать тест. В первоначально созданном проекте, если при его создании была выбрана галочка Create separate source and output folders, есть папочка src - в нее мы будем ложить исходники наших задачек. Для тестов лучше создать отдельную папочку (правой кнопкой на проекте, потом New, SourceFolder), назовем ее test. Потом нажимаем на нее правой кнопочкой, New Class, JUnit Test Case. Хотя можно конечно и в корень все свалить, но так лучше наверное будет.
В диалоговом окне указываем имя теста. Лучше его называть точно также как и тестируемый и класс, только в конце прибавлять Test. Потому что кажется что-то из этого обязательно (либо окончание на Test, либо имя тестируемого класса в начале), но я не помню что, если кому интерсно можно доки почитать
. Нажимаем Finish. Получаем пустой класс.
Теперь в него надо добавить тестирующие методы. Каждый тест - это отдельный метод. Он должен обязательно быть public void и название должно начинаться на test. В нашем примере у нас 2 тетста:
import junit.framework.TestCase;
public class APlusBSampleTest extends TestCase {
public void test0() {
assertEquals(2, APlusBSample.solve(1, 1));
}
public void test1() {
assertEquals(4, APlusBSample.solve(1, 3));
}
}
Для проверки правильности возвращаемых данных здесь используется метод asserEquals() - проверка на равенство. Есть куча других асертов: assertTrue, assertNotNull итд, подходящий можно найти при помощи саджеста по Ctrl+Space. В крайнем случае в assertTrue любое логическое выражение запихать можно.
Как запустить тест. Нажимаем в PackageExplorer на тесте правой кнопкой, Run As, JUnitTest. Рядом с PackageExplorer должна появиться вкладочка JUnit, там можно посмотреть результаты.
Недостатки такого способа тестирования в том, что нужно сначала считать все данные, где-то сохраниьт и передать их в решающий метод. Иногда в задачах требуется читать данные и тут же выводить результат (чтобы не просматривать дважды). Или иногда чтоб хранить все считанные данные не хватит по ограничениям памяти. Тогда можно передавть в решающий метод входной и выходной поток, чтобы чтение и вывод производились непосредственно внутри метода. Тогда в тестах нам придется создавать свои потоки и подсовывать их в метод. С этим еще надо поразбираться...
Отредактировано ДубининаЮлия (2007-11-16 17:35:26)
Поделиться32007-11-16 17:40:29
Вот так выглядит решение A+B с использованием потоков:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;
public class APlusBSample {
public static void main(String[] args) throws IOException {
solve(System.in,System.out);
}
public static void solve(InputStream inp, OutputStream out) throws IOException {
Scanner s=new Scanner(inp);
PrintWriter pw=new PrintWriter(out);
int res = s.nextInt()+s.nextInt();
pw.print(res);
pw.close(); //Обязательно незабыть, или в out будет пусто
}
}
А это тетсты:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import junit.framework.TestCase;
public class APlusBSampleTest extends TestCase {
public void test0() throws IOException {
OutputStream out = new ByteArrayOutputStream();
InputStream inp = new ByteArrayInputStream("1 1".getBytes());
APlusBSample.solve(inp, out);
assertEquals("2", out.toString());
}
public void test1() throws IOException {
OutputStream out = new ByteArrayOutputStream();
InputStream inp = new ByteArrayInputStream("1 3".getBytes());
APlusBSample.solve(inp, out);
assertEquals("4", out.toString());
}
}
Поделиться42009-03-04 22:09:35
Всем привет!!!
большая просьба помочь......
у меня диплом - через месяц защита. Моя задача - разработать тестер для функционального программирования.
т.к. я в программироваии не сильна, обращаюсь за помощью...
моя почта albinajan88@mail.ru