Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > junit тесты калькулятора


Автор: Samotnik 25.10.2007, 12:37
добрый день помогите плз с тестированием!
Имеется в наличии класс (Калькулятор типа  smile ):
Код

public class CalculateMoj {
    private int indicator;
    private char operation;
    private double memory = 0.0;

    public int getIndicator() {
        return indicator;
    }
    public void setIndicator(int indicator) {
        this.indicator = indicator;
    }

    public void setOperation(char operation) {
        this.operation = operation;
    }

    public double getMemory() {
        return memory;
    }
    public void setMemory(double memory) {
        this.memory = memory;
    }
     public static void main(String[] args) {
        }
}

Пишу к нему тесты:
Код

import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
public class TestClass extends TestCase {
    public TestClass(String testName) {
        super(testName);
    }
      public void testComplexOperation() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('/');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", calc.getIndicator(), 4);
    }
    public void main(String args[]){
    TestRunner runner = new TestRunner();
    TestSuite suite = new TestSuite();
    suite.addTest(new TestClass("testComplexOperation"));
    runner.doRun(suite);
    }
}

Задача: Чтоб тесты прошли, хотя бы этот. Не могу понять чего не так, походу что-то в методе не дописал!!  
Компилятор пишет (в тесте)   ожидается 3, а возвращается 4

Автор: Kangaroo 25.10.2007, 12:45
А где в твоем классе калькулятора считается результат?

И по ДжЮниту:
Код

CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('/');
        calc.setIndicator(3);
        calc.setOperation('=');
assertEquals("Result of division operation", calc.getIndicator(), 4);


Сначала ты устанавливаешь Индикатор, а потом просто его и читаешь.. ?
Может надо читать результат?

И еще - в assertEquals сначала пишется то, что ожидаешь, а потом что получится.
То есть:
Код

assertEquals("Result of division operation",  4, calc.getResult());

Автор: Samotnik 25.10.2007, 12:48
Цитата(Kangaroo @  25.10.2007,  12:45 Найти цитируемый пост)
А где в твоем классе калькулятора считается результат?

Новы метод нужно написать кот результат считает?

Автор: Kangaroo 25.10.2007, 12:52
Цитата(Samotnik @ 25.10.2007,  12:48)
Цитата(Kangaroo @  25.10.2007,  12:45 Найти цитируемый пост)
А где в твоем классе калькулятора считается результат?

Новы метод нужно написать кот результат считает?

Это было бы логично )

Ты же тестируешь калькулятор. Тебе нужно узнать правильно ли он работает. Ты ему подаешь входные данные 12/3, следовательно должен получить 4 как результат операции.
Вот ты и пишешь:
Код

assertEquals("Result of division operation",  4, calc.getResult());

Автор: Samotnik 25.10.2007, 12:54
Цитата(Kangaroo @  25.10.2007,  12:52 Найти цитируемый пост)
Это было бы логично )

А как, я не могу понять! Как мне в новом методе получить результат предыдущего (с числом), далее получить операцию(тоже из метода) и опяит число ....
 smile    smile 

Автор: Kangaroo 25.10.2007, 13:01
Так это уже не ДжЮниты, а написание калькулятора.. 
Поищи примеры в интернете, самые просты калькуляторы.

Сам я сейчас на обед убегаю, прийду - может чем помогу.

Автор: Samotnik 25.10.2007, 13:13
В нете поискал, там калькуляторы другого типа ....  smile 
Пэ.Эс.
Просьба модераторам переименовать название темы, в "Написание калькулятора" А то получается несоответствие,  т.к. с тестами я разобрался,а вот с калькулятором  еще нет!

Автор: Orange 25.10.2007, 13:49
Примеры калькуляторов приводились здесь: http://forum.vingrad.ru/forum/topic-23685/hl/calculator/index.html
( А href тэг не работает тут что-ли?)

Автор: Samotnik 25.10.2007, 13:56
Orange,  так под GUI  я и в нете находил.  ток мне нужно под консоль, и с условием, чтоб тест прошол.  вот этот
Код

 public void testComplexOperation() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('/');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", calc.getIndicator(), 4);
    }

И никаких новых переменных вводить НЕЛЬЗЯ !!

Автор: Orange 25.10.2007, 14:00
Так убери гуёвую состовляющую, просто логику оттуда возьми(посмотри там последний комент)

Автор: Samotnik 25.10.2007, 14:22
Orange,  так вся проблема, что мне с ТЕСТАМИ нужно все делать, т.е.
Код

public void testComplexOperation() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('/');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", calc.getIndicator(), 4);
    }

Цитата(Samotnik @  25.10.2007,  13:56 Найти цитируемый пост)
И никаких новых переменных вводить НЕЛЬЗЯ !! 

!!!
Т.е. нельзя вводить новый метод  getResult()  !!!
должно все работать через setIndicator()  и  setOperation()  !!!  а выводиться через  getIndicator()

Автор: AlexeyVorotnikov 25.10.2007, 14:43
Так переменные нельзя вводить или методы?

Автор: Samotnik 25.10.2007, 14:45
Цитата(AlexeyVorotnikov @  25.10.2007,  14:43 Найти цитируемый пост)
Так переменные нельзя вводить или методы? 

Ничего нельзя вводить!!!  
Кстати я уже сделал!!
Класс  Test 
Код

import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

public class TestClass extends TestCase {
    public TestClass(String testName) {
        super(testName);
    }

    public void testComplexOperation() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('+');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", 15, calc.getIndicator());
    }

    public void testComplexOperation2() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('/');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", 4, calc.getIndicator());

    }

    public void testComplexOperation5() {
        CalculateMoj calc = new CalculateMoj();
        try {
            calc.setIndicator(12);
            calc.setOperation('/');
            calc.setIndicator(0);
            calc.setOperation('=');
        }
        catch (Exception e) {
            assertEquals(true, true);
        }

    }

    public void testComplexOperation3() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('*');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", 36, calc.getIndicator());
    }

    public void testComplexOperation4() {
        CalculateMoj calc = new CalculateMoj();
        calc.setIndicator(12);
        calc.setOperation('-');
        calc.setIndicator(3);
        calc.setOperation('=');
        assertEquals("Result of division operation", 9, calc.getIndicator());
    }

    public void main(String args[]) {
        TestRunner runner = new TestRunner();
        TestSuite suite = new TestSuite();
        suite.addTest(new TestClass("testComplexOperation"));
        suite.addTest(new TestClass("testComplexOperation2"));
        suite.addTest(new TestClass("testComplexOperation3"));
        suite.addTest(new TestClass("testComplexOperation4"));
        suite.addTest(new TestClass("testComplexOperation5"));
        runner.doRun(suite);
    }
}

класс  калькулятор
Код

public class CalculateMoj {
    private int indicator;
    private char operation;
    private double memory = 0.0;
    private double result;
    private int counter;
    private int zapom;
    private int zapom2;

    public int getIndicator() {
        return indicator;
    }

    public void setIndicator(int indicator) {
        if (counter == 0) {
            zapom = indicator;
            this.indicator = indicator;
        } else {
            zapom2 = indicator;
            this.indicator = indicator;
        }
    }

    public void setOperation(char operation) {
        if (operation != '=') {
            this.operation = operation;
            counter = 1;
        } else {
            switch (this.operation) {
                case('-'):
                    this.indicator = zapom - zapom2;
                    break;
                case('+'):
                    this.indicator = zapom + zapom2;
                    break;
                case('*'):
                    this.indicator = zapom * zapom2;
                    break;
                case('/'):
                    this.indicator = zapom / zapom2;
                    break;
            }
            zapom = this.indicator;
            zapom2 = 0;
            counter = 0;
        }
        this.operation = operation;
    }

    public double getMemory() {
        return memory;
    }

    public void setMemory(double memory) {
        this.memory = memory;
    }

    public static void main(String[] args) {
    }
}

осталось разобраться с Memory !!

Автор: AlexeyVorotnikov 25.10.2007, 14:52
Стоп-стоп-стоп! Ты же только что сказал, что нельзя вводить переменные. Так почему же ты добавил
    private double result;
    private int counter;
    private int zapom;
    private int zapom2;
?

Автор: alex_nevolin 25.10.2007, 15:00
http://forum.vingrad.ru/forum/topic-169560/kw-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80/hl/eval/index.html

Автор: Samotnik 25.10.2007, 19:21
Цитата(AlexeyVorotnikov @  25.10.2007,  14:52 Найти цитируемый пост)
Стоп-стоп-стоп! Ты же только что сказал, что нельзя вводить переменные. Так почему же ты добавил

AlexeyVorotnikov,  Прошу прощения, моя вина, сказал не точно.  Дело в том, что нельзя вводить новые методы и переменные в тест классе, а в обычном(калькуляторе) можно и даже нужно.

Черт, заговнили мою прогу, если 3 числа сложить, то тесты выдают фэйлд  smile  И еще с делением на ноль не точно продуманно!
Подскажите плз может можно заменить 
Код

  public void setIndicator(int indicator) {
        if (counter == 0) {
            zapom = indicator;
            this.indicator = indicator;
        } else {
            zapom2 = indicator;
            this.indicator = indicator;
        }
    }

На то, чтобы можно было работать со сколько угодным колличеством  чисел?  
Т.к. в данном случае калькулятор будет работать если ввести 2 числа (2+2), , а вот если (2+2+2), то уппс...  тест фэйлд 


Автор: alex_nevolin 26.10.2007, 10:46
А чем не подходит решение на Скриптовом механизме java 6 ?
Там ведь дано практически универсальное решение вычисления выражений. 
А тесты к такому универсальному калькулятору написать одно удовльствие.

Автор: Samotnik 26.10.2007, 10:49
Цитата(alex_nevolin @  26.10.2007,  10:46 Найти цитируемый пост)
А чем не подходит решение на Скриптовом механизме java 6 ?

А это что такое???   Про что читать вообще?

Автор: alex_nevolin 26.10.2007, 12:10
Посмотри несколько постов выше... там я линк давал на похожий топик.

Автор: Samotnik 26.10.2007, 13:47
Цитата(Samotnik @  25.10.2007,  19:21 Найти цитируемый пост)
Черт, заговнили мою прогу, если 3 числа сложить, то тесты выдают фэйлд  smile  И еще с делением на ноль не точно продуманно!

Опять все оказалось элементарно, я просто не заносил результат подсчетов  в  переменную, и она есстно брала самое первое значение
Нуно было просто написать
Код

zapom = this.indicator;

И УСЕ!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)