Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 12.06.2017
Сообщений: 36

Junit тестирование. Как создавать адекватные модули?

28.06.2017, 20:18. Показов 1051. Ответов 2

Студворк — интернет-сервис помощи студентам
Разбираюсь с Junit в Eclipse. Eсть LRU и LFU алгоритмы с вложенными классами. Вот LRU класс:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package Main;
import java.util.LinkedHashMap;
import java.util.Map;
 
 
 
public class LRUAlgoritm<K, V> implements Cache<K, V>{
     private LRUStorage storage; 
 
 
        public LRUAlgoritm(int capacity) {
            this.storage = new LRUStorage(capacity);
        }
 
    @Override
    public V get(K key) {
 
        return storage.get(key);
    }
    @Override
    public V put(K key, V value) {
 
        return storage.put(key,value);
    }
 
 
    private class LRUStorage extends LinkedHashMap<K, V>{
        private final int capacity;
 
        private LRUStorage (int capacity){
            this.capacity = capacity;
        }
        @Override
            protected boolean removeEl******try(Map.Entry<K, V> eldest){
                return size()>capacity ; 
            }
        }
 
    @Override
    public String toString() {
        return  "storage= " + storage ;
    }
 
 
}
Вот LFU класс:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package Main;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
 
public class LFUCache<K, V> implements Cache<K, V> {
 
    private final LinkedHashMap<K, Node> storage; //the declaration of the variable "storage" for storing data with key type "K" and value type "Node".
    private final int capacity;
 
    public LFUCache(int capacity) {
        if (capacity <= 0) {//validation of the capacity on the negative and the zero value
            throw new IllegalArgumentException("Capacity should be more than 0");
        }
        this.capacity = capacity;
        this.storage = new LinkedHashMap<>(capacity, 1); //initialization of variable "storage" - data storage. 
                                                            //Inside the parentheses: the specified initial capacity and load factor = 1 
    }
//overriding methods "get" and "put" to be implemented from the interface "Cache"
    @Override
    public V get(K key) {
        Node node = storage.get(key);//the get method of LinkedHashMap class according to the
                                        //"http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html" 
                                        //returns "null" if the requested key is missing or 
                                        //has the value - a Hash mapping key if the key exists in the cache storage "storage"
        if (node == null) {//check the value of the variable "node" to NULL
            return null;
        }
        return node.incrementFrequency().getValue();//if the value of the variable "node" is not NULL, 
                                                    //then the called method to increase the frequency on the unit and 
                                                    //obtain take associated with the key "key" variable value "value"
    }
 
    @Override
    public V put(K key, V value) {
       //   if (storage.get(key)!=null&& Objects.equals(value, storage.get(key).getValue()))
        //{return storage.get(key).incrementFrequency().getValue();}//verification of the presence of the led element in the cache storage "storage" 
                                                                //if the element is present then return the value from the cache store
 
        doEvictionIfNeeded(key);//verification of occupancy of the cache storage, and the presence of the inserted key in the cache storage "storage"
 
        Node oldNode = storage.put(key, new Node(value));//the put method, inherited from Map interface, returns the previous value associated with key, 
                                                            //or null if there was no mapping for key
        if (oldNode == null) {
            return null;
        }
        return oldNode.getValue();
    }
 
 
// method to displace the old value with the least frequency when the storage of the cached data is completely filled
    private void doEvictionIfNeeded(K putKey) {
        if (storage.size() < capacity) {//verification of occupancy of the cache storage
            return;
        }
        long minFrequency = Long.MAX_VALUE;//the maximum assignable value for a variable of type Long
        K keyToRemove = null;
        for (Map.Entry<K, Node> entry : storage.entrySet()) {//search cash store the minimum value of frequency the "frequency" of all those elements
            if (Objects.equals(entry.getKey(), putKey)) {
                //no eviction required cause element already exists, we just need to replace it
                return;
            }
            if (minFrequency >= entry.getValue().getFrequency()) {
                minFrequency = entry.getValue().getFrequency();
                keyToRemove = entry.getKey();
            }
        }
        storage.remove(keyToRemove);//removal item's key with the minimum number of calls
    }
//an inner class "Node" in the object which is stored the value "value". 
    //And is created for this value a variable to hold the frequency "frequency" to the value "value'
    private class Node { 
        private final V value;
        private long frequency;
 
        //create a constructor with a parameter (a value of type V) to write the value in the node object.
        //And setting the initial value of the frequency of reference to "value" - "frequency" = 1
        public Node(V value) {
            this.value = value;
            this.frequency = 1;
        }
 
        public V getValue() {
            return value;
        }
 
        public long getFrequency() {
            return frequency;
        }
 
        public Node incrementFrequency() {// method to increase frequency by one(+1)
            ++frequency;
            return this;
        }
 
        @Override
        public String toString() {
            return "Node [value=" + value + ", frequency=" + frequency + "]";
        }
 
    }
    @Override
    public String toString() {
        return "storage = "+ storage + ", capacity=" + capacity ;
    }
}
Для LRU алгоритма я сделал тест класс для класса LRUStorage IDE сгенерировала код класса с одним единственным методом:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Test;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
 
public class TestLRUAlgoritm {
 
    @Test
    public final void testRemoveEl******tryEntryOfKV() {
        fail("Not yet implemented");
    }
 
}
Каким образом его теперь протестировать? метод removeEl******try() это переопределенный метод LinkedHashMap ? какие значения ему отдавать, что бы они адекватны для тестирования? Пересмотрел и Ткача, Немчинского и Владыкина на простых примерах какие данные передать и какой ассерт взять понятно(добавляем 2 и 2 и ждем 4), здесь же голову сломал, кучу статей перечитал ничего не понимаю, помогите разобраться?

P.S. removeEl******try() это remove Eldest Entry. Редактор форума ставит звездочки почему не знаю

Добавлено через 4 минуты
я только пытаюсь разобраться, что нужно теститровать и какую именно функциональность необходимо тестировать. В моем примере (class LRUAlgoritm) есть три метода во внешнем классе LRUAlgoritm (get, put, toString) и один во внутреннем классе LRUStorage (remove Eldest Entry). Все они переопределенные. Нужно ли тестировать их логику? Ведь по правилам нужно покрывать тестами 100% кода? Если да, то какие параметры и что на выходе тогда должно быть?

второй класс дан как разъяснение других примеров, для наглядности.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2017, 20:18
Ответы с готовыми решениями:

тестирование с JUnit
Откуда вот такая ошибка??: .E Time: 0 There was 1 error: 1) testAge(TestClass) at Main.main(Main.java:7) FAILURES!!! Tests...

Тестирование в JUnit
Здравствуйте, требуется проверить значения матрицы на принадлежность диапазону, т.е. получить ошибку Error 500 . Я не знаю как имитировать...

Как в С++ создавать модули (библиотеки)?
Подскажите как в С++ создавать модули(библиотеки)? Чем проще тем лучше)) Заранее спасибо.

2
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
29.06.2017, 10:02
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
 
public class LRUAlgoritmTest {
    LRUAlgoritm<String, Integer> lru;
 
    @Before
    public void setUp() throws Exception {
        String[] ss = "value string number".split(" ");
 
        lru = new LRUAlgoritm<>(100);
 
        for (int i = 0; i < 3; i++) {
            lru.put(ss[i], i*10+10);
        }
    }
 
    @After
    public void tearDown() throws Exception {
        lru = null;
    }
 
    @Test
    public void get() throws Exception {
        Integer value = lru.get("value");
        assertEquals(10,value,0);  // если не равно вылетит Assert
    }
 
    @Test
    public void put() throws Exception {
        int oldValue=  lru.put("string",25);
        int newValue = lru.get("string");
        assertEquals(20,oldValue,0);  // если не равно вылетит Assert
        assertEquals(25,newValue,0);  // если не равно вылетит Assert
 
    }
 
    @Test
    public void toStringTest() throws Exception {
         String oldValue = "storage= {value=10, string=20, number=30}";
         String  newValue = "storage= {value=10, string=20, number=30, keep=40}";
 
         assertTrue(oldValue.equals(lru.toString()));
         lru.put("keep",40);
        assertTrue(newValue.equals(lru.toString()));
 
 
    }
 
}

Смотрите код. Значит смысл тестирования, как я понимаю, в том, чтобы проверить корректную работу методов.
В классе тестирования Вы можете создать хоть 100 методов, необязательно столько, сколько в тестируемом классе.
И каждый метод тестирования выполняет свою задачу.
Каждый метод тестирования по сути делает проверки, и если проверка дает ошибку assert как раз ее и генерит для пользователя, по сути выбрасывает исключение.
Тестовые классы строятся по шаблону @Before @After и @Test
@Before метод который запускается для каждого метода тестирования, до него, создает экземпляр тестируемого класса или что то еще, короче подготовка перед запуском любого метода тестирования
@After завершение после любого метода тестирования, ну не знаю, закрыть потоки
@Test любой тестовый метод.

В приведенном коде создан тестовый класс для LRU, проверяется работа методов put, get и toString.
Везде вставлены корректные результаты для сравнения, поэтому при запуске ошибок не будет.
Поменяйте любой из параметров и увидите как срабатывают Assert.
1
0 / 0 / 1
Регистрация: 12.06.2017
Сообщений: 36
04.07.2017, 11:40  [ТС]
Как я понял изолировать какой то метод из класса при помощи тестирования это чисто сугубо логически и абстрактно. Т.е. создадим какие-то входные данные пустим их на код, а затем ассертом проверяем логику веток программы. Причем мы только проверяем свои догадки по работе программы. А ассерт нашу догадку воплощает на коде и если при работе ассерта ветка логики использовалась, то она тогда и помечается в приложениях по покрытию (JaCoCo и т. д.).
Я ничего не упустил?
Тогда остается вопрос, а как понять что ветка логики использовалась напрямую, а не всвязи с проверкой другой логики?
Ну например внутренние методы внутренних классов помеченных приват.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2017, 11:40
Помогаю со студенческими работами здесь

Junit тестирование метода
Здравствуйте! Интересует такой момент. Есть метод: public void defineTriangle( double a, double b, double c){ ...

Тестирование метода JUnit
В общем интересует - как тестировать метод если он возвращает коллекцию? //todo: Сделать сортировку слов по количеству букв ...

Тестирование методов через JUnit
Доброго времени суток Помогите пожалуйста. Есть такой метод для удаления файлов private void deleteFile(FileElement fi) { ...

JUnit тестирование блока catch
Как написать тесты к методу чтобы покрывались блоки catch () и остальные строки? 4.12 Картинки и любые другие файлы загружайте на...

[JUnit] Относится ли Unit тестирование только к методам?
В вики пишут: Можно ли протестировать что-то кроме методов тем же, например, JUnit? Что может называться модулем исходного кода...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru