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

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

28.06.2017, 20:18. Показов 1043. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru