powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Тестирование. Что именно тестировать? Как определить середину?
25 сообщений из 361, страница 8 из 15
Тестирование. Что именно тестировать? Как определить середину?
    #39800001
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123зачем так узко?
дело не в узко, а в том, что я тогда вообще не понимаю, что у людей лежит в src/test )))

Для меня, src/test в первую очередь "проверка того, что не нарушилась работоспособность работающей ранее функциональности, если её код мог быть затронут при исправлении некоторых дефектов в другой функциональности" ( C ) wiki
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800014
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут некоторые 1500 раз свой код запускают поэтому им эти твои проверки ни разу не нужны. да и вообще тесты это потеря времени. ты о чем воще.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800020
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTтут некоторые 1500 раз свой код запускают поэтому им эти твои проверки ни разу не нужны. да и вообще тесты это потеря времени. ты о чем воще.
Я с трудом себе представляю как можно после крупного рефакторинга
по "щелчку пальцев" определить что ничего не сломалось.

Мне кажется - только автоматизация. Кто там 1500 раз делает?
Покажите мне этого человека. И что он это делает каждый день?
Или по изменению?
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800037
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
Ты проснулся. Поздравляю.
Если такие как ты говорят что тестируют, то пусть расскажут как.
Где твой интеграционный?
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800040
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКто там 1500 раз делает?я делаю))).
Но я готов покаятся, если будет автоматизация.
Никто не показал.
Один пример выше был, там dsl и огурцы учить надо).
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800041
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123maytonКто там 1500 раз делает?я делаю))).
Но я готов покаятся, если будет автоматизация.
Никто не показал.
Один пример выше был, там dsl и огурцы учить надо).
Дай бох. Я надеюсь что про 1500 раз ты пошутил.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800044
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
if на пять веток напишу и 5 раз запускаю.
Раз в 5 минут примерно запускаю.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800046
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonнадеюсь что про 1500 раз ты пошутил.надеюсь про то что запуск 10 мин. Тут тоже шутят?
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123maytonнадеюсь что про 1500 раз ты пошутил.надеюсь про то что запуск 10 мин. Тут тоже шутят?
Смотря что. Биржевая система греет кеши примерно 20 минут.
Для поднятия в стеке Jenkins. Но это для end-to-end.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800062
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо это для end-to-end.вот и я говорю. Все про крайности.
Я про 1500 запусков. Другой про 10мин и он пишет по памяти-тестам с черной повязкой. Третий с огурцами)
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800106
казинак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex55555казинака откуда взялся "дополнительный, таки не протестированный метод" ?
От прошлых подвигов, например.

Тебе надо понять одно - программирование не заканчивается на одном единственном кейсе. И не начинается с одного единственного кейса. Это процесс. Он долгий. Кейсов много. И они наслаиваются. И когда кто-то поступает по твоему, то всегда получает косяки из-за наслоений, потому что проверяет только то, что ему кто-то написал в данном кейсе.
это в ипанутых системах они наслаиваются
патамушта там поклоняются фаулеру и пишут километры оберток (лейеров),
то бишь универсальных классов, которые должны использоваться ВЕЗДЕ

а в норм системах, парэкзампль, изменение в логике начисления процентов не сломает заведение договоров
патамушто норм система реализована модульно, и в случае выхода из строя одного модуля, другие не ломаются
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800118
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловSergunkaРасскажите, не надо стеснятся Тут народ уже 7 страниц спорит о том, что тесты вроде как хорошая штука, вот только они должны быть по делу, а не просто для увеличения покрытия, потому что последняя метрика в действительности мало о чемвообще ни о чем не говорит, потом вы приходите весь в белом и говорите: эй, пацаки, тут есть подход fucking around driven development - там уже все продумано за вас, есть аж специальный DSL, нужно только реализовывать то что в жире написали и все будет хорошо. Ну давайте посмотрим на ваш cucumber...

Сценарий:
Код: sql
1.
2.
3.
4.
5.
    When a user queries a list of countries _ADS_
    Then a list of countries should be returned _ADS_
    | USA    |
    | Canada |
    | Mexico |


"Реализация":
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	@When("^a user queries a list of countries _ADS_$")
	public void a_user_queries_a_list_of_countries__ADS_() throws Throwable {
		countries = retrieveAll(Country.class, null);
	}

	@Then("^a list of countries should be returned _ADS_$")
	public void a_list_of_counries_should_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
	}



Ну, во-первых, никакого DSL какбы и нет - ну позволяет оно каким-то образом параметризовывать (у вас зачистку тестовых данных перед выполнением сценария не увидел, но будем считать что оно может иметь место) тесты через регулярные выражения (буэээ) и какие-то простенькие списки pojo (что если перед тестом нужно мегабайт сильно связных данных в базу пролить?) и на этом все, зато разработчик этих "сценариев" начинает чувствовать себя не обезьяной, а чем-то большим

во-вторых, помимо того, что нужно писать сами тесты, добавляется еще обязанность писать всю эту обвязку к cucumber, при этом очевидно, что все будущие потребности "сценариев" с первого раза не покрыть, поэтому эту лапшу придется постоянно переписывать (есть мнение, что если придется тестировать граничные случаи, то cucumber будет только мешаться)

в-третьих, "корректность" реализации теста отдается на откуп непонятно кому: вот у вас в сценарии написано что должен прийти список из трех стран, а вы проверяете только вхождение одного набора в другой, т.е. если в вашем тесте сервис вернет больше стран или дубли, то тест все равно будет успешным - ну и зачем такой тест нужен?


В целом, подход, который вы пропагандируете, хорош только тем, что он снимает ответственность с разработчика: вот какие сценарии мне написали, такие приложение и проходит, однако к правильной работе приложения это не имеет никакого отношения - все то же самое что и с метрикой покрытия.


Извините, Вы специально вырвали из контекста сам тест?

Код: sql
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.
Feature: Support to create/update/delete Open Model Asset Data Service (ADS) based on Country/States/Cities hierarchy 
  As an ADS Modeler,
  I am able to create/update/delete model elements and query using Graph Expression Language

Scenario: Create and query Country/States/Cities 

    Given the countries table _ADS_
      | uri               | name    | 
      | /countries/USA    | USA     | 
      | /countries/Canada | Canada  | 
      | /countries/Mexico | Mexico  | 
      
    And the states table _ADS_
      | uri        | name        | parent          |
      | /states/CA | CA          | /countries/USA  |
      | /states/WA | WA          | /countries/USA  |
      
    And the cities table _ADS_
      | uri                  | name        | parent            |
      | /cities/LosAngeles   | LosAngeles  | /states/CA        |
      | /cities/VancouverUSA | Vancouver   | /states/WA        |
      | /cities/Vancouver    | Vancouver   | /countries/Canada |
      
    When a user queries a list of countries _ADS_
    Then a list of countries should be returned _ADS_
    | USA    |
    | Canada |
    | Mexico |
    
    When a user queries a list of countries by city name "Vancouver" _ADS_
    Then a list of countries should be returned _ADS_
    | USA    |
    | Canada |
    
    When a user queries a list of states _ADS_
    Then a list of states should be returned _ADS_
    | CA |
    | WA |
    
    When a user queries a list of cities _ADS_
    Then a list of cities should be returned _ADS_
    | LosAngeles  |
    | Vancouver   |
    | Vancouver   |



https://github.com/SVyatkin/ads-bdd/blob/master/src/test/resources/Cucumber/IntegrationTest/customer/CountryCities_Test.feature

Я тестирую то, что написано в ценарии не более того

Код: sql
1.
2.
3.
Feature: Support to create/update/delete Open Model Asset Data Service (ADS) based on Country/States/Cities hierarchy 
  As an ADS Modeler,
  I am able to create/update/delete model elements and query using Graph Expression Language



Вам перевести с английского на русский?

Ваши притензии из разряда зачем было Генри Форду устраивать конвейр? Это же столько дополнительного оборудования? Пусть работяги бегают вокруг машины и гайки крутят

Я беспорно благодарен Вашему стремлению разобраться с вопросом для Вас лично, что такое тетстирование и все такое... мне лично приятно, что Вы прочитали мой код и сделали отличные выводы.

Но поймите этот код я опубликовал несколько для других целей кроме того как поделится как у нас в конторе дело обстоит хотелось бы услышать как это дело обстоит в других конторах. Моему коду уже без малого лет пять неужели никто так особо и не продвинулся из уважаемой публики?!
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800121
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123
Один пример выше был, там dsl и огурцы учить надо).

Из моего опыта это занмает пару сессий т.е. часа два/три, чтоб вменяемый разработчик стал писать огурцами. Самому сидеть разбираться видимо займет пару тройку дней, но тоже не смертельно.

Просто когда над проектом работают две\три комманды по человек пять другого варианта я просто не вижу.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800133
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergunkaИзвините, Вы специально вырвали из контекста сам тест?Так вы чтоли не поняли что ваши тесты неправильные? Давайте еще раз:
Код: java
1.
2.
3.
4.
5.
6.
7.
	@Then("^a list of countries should be returned _ADS_$")
	public void a_list_of_counries_should_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
	}

Ожидание сценария: должен вернуться определенный список стран
Реализация теста: в возвращенном списке стран присутствуют ожидаемые
т.е. если вот в этом сценарии:
Код: java
1.
2.
3.
4.
    When a user queries a list of countries by city name "Vancouver" _ADS_
    Then a list of countries should be returned _ADS_
    | USA    |
    | Canada |

Сервис вернет еще и Мексику, то тест все равно пройдет - такие тесты не нужны, никому, совсем.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800154
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловSergunkaИзвините, Вы специально вырвали из контекста сам тест?Так вы чтоли не поняли что ваши тесты неправильные? Давайте еще раз:
Код: java
1.
2.
3.
4.
5.
6.
7.
	@Then("^a list of countries should be returned _ADS_$")
	public void a_list_of_counries_should_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
	}

Ожидание сценария: должен вернуться определенный список стран
Реализация теста: в возвращенном списке стран присутствуют ожидаемые
т.е. если вот в этом сценарии:
Код: java
1.
2.
3.
4.
    When a user queries a list of countries by city name "Vancouver" _ADS_
    Then a list of countries should be returned _ADS_
    | USA    |
    | Canada |

Сервис вернет еще и Мексику, то тест все равно пройдет - такие тесты не нужны, никому, совсем.

Вы реально еще и программировать не умеете "на сухую". Ну проверьте, что вам вернет

Assert.isTrue(set.containsAll(set1));

containsAll(Collection<?> c)
Returns true if this set contains all of the elements of the specified collection.


если в set1 будет еще и Мексика то ассеt выкинет ошибку

На самом деле будет логическая ошибка если вернется только одна страна USA или Canada. Ну, так спасибо, конечно, поржал
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800158
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergunkaВы реально еще и программировать не умеете "на сухую". Ну проверьте, что вам вернет

Assert.isTrue(set.containsAll(set1));

containsAll(Collection<?> c)
Returns true if this set contains all of the elements of the specified collection.


если в set1 будет еще и Мексика то ассеt выкинет ошибку

На самом деле будет логическая ошибка если вернется только одна страна USA или Canada. Ну, так спасибо, конечно, поржал Вот зачем вы что-то пишете про Генри Форда, если сами не в состоянии сравнить два сраных списка? Очередная попытка:
Код: java
1.
2.
3.
4.
5.
6.
7.
	@Then("^a list of countries should be returned _ADS_$")
	public void a_list_of_counries_should_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
	}


List<String> countries - то что пишло из сценария, т.е. [USA, Canada], превращается в set1 (new HashSet<String>(countries))
this.countries - то что пришло из сервиса:
Код: java
1.
2.
3.
4.
	@When("^a user queries a list of countries _ADS_$")
	public void a_user_queries_a_list_of_countries__ADS_() throws Throwable {
		countries = retrieveAll(Country.class, null);
	}

превращается в set, теперь вопрос на засыпку: что вернет [USA, Canada, Mexico].containsAll([USA, Canada])? Вы можете продолжать дальше ржать сколько угодно, однако мнение о себе вы уже составили, ровно как и о General Electric.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800172
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловSergunkaВы реально еще и программировать не умеете "на сухую". Ну проверьте, что вам вернет

Assert.isTrue(set.containsAll(set1));

containsAll(Collection<?> c)
Returns true if this set contains all of the elements of the specified collection.


если в set1 будет еще и Мексика то ассеt выкинет ошибку

На самом деле будет логическая ошибка если вернется только одна страна USA или Canada. Ну, так спасибо, конечно, поржал Вот зачем вы что-то пишете про Генри Форда, если сами не в состоянии сравнить два сраных списка? Очередная попытка:
Код: java
1.
2.
3.
4.
5.
6.
7.
	@Then("^a list of countries should be returned _ADS_$")
	public void a_list_of_counries_should_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
	}


List<String> countries - то что пишло из сценария, т.е. [USA, Canada], превращается в set1 (new HashSet<String>(countries))
this.countries - то что пришло из сервиса:
Код: java
1.
2.
3.
4.
	@When("^a user queries a list of countries _ADS_$")
	public void a_user_queries_a_list_of_countries__ADS_() throws Throwable {
		countries = retrieveAll(Country.class, null);
	}

превращается в set, теперь вопрос на засыпку: что вернет [USA, Canada, Mexico].containsAll([USA, Canada])? Вы можете продолжать дальше ржать сколько угодно, однако мнение о себе вы уже составили, ровно как и о General Electric.

Я Вас вроде как поблагодарил за проделанную работу Меня всегда умиляют люди которые так долго что-то пытаются доказать когда фикс очевидный и занимает одну строку. Тем более Вы смотрите не на тот метод который возращает по имени города страны

Код: sql
1.
2.
3.
4.
	@When("^a user queries a list of countries by city name \"([^\"]*)\" _ADS_$")
	public void a_user_queries_a_list_of_countries_by_city_name__ADS_(String city) throws Throwable {
		countries = retrieveAll(Country.class, "name=" +city+ ">parent[t3]");
	}




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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	@Then("^a list of countries MUST be returned _ADS_$")
	public void a_list_of_counries_MUST_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
                Assert.isTrue(set1.containsAll(set));
	}



По понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800184
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergunkaНу, надо подфиксить метод типо так, чтоб было тождественное равенство

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	@Then("^a list of countries MUST be returned _ADS_$")
	public void a_list_of_counries_MUST_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
                Assert.isTrue(set1.containsAll(set));
	}

Вы еще день будете осознавать, что сравнение наборов - это не то же самое что сравнение списков.

SergunkaПо понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое
Демонстрирую мастер-класс на примере того как должен был выглядеть ваш сценарий:

Код: 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.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.IsEqual.equalTo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.testng.annotations.Test;

/**
 * @author Andrey B. Panfilov <andrey@panfilov.tel>;
 */
public class HamcrestDemo {


	@Test
	public void demo() {
		List<Country> countryList = Arrays.asList(new Country("USA"), new Country("Canada"));
		List<String> expectedNames = Arrays.asList("USA", "Mexico");
		assertThat(countryList, hasSize(expectedNames.size()));
		assertThat(countryList, contains(HamcrestDemo::aCountryNamed, expectedNames));
	}


	public static <E, V> Matcher<Iterable<? extends E>> contains(Function<Matcher<V>, Matcher<E>> func, List<V> items) {
		List<Matcher<? super E>> matchers = new ArrayList<>();
		for (V item : items) {
			matchers.add(func.apply(equalTo(item)));
		}
		return IsIterableContainingInOrder.contains(matchers);
	}

	public static Matcher<Country> aCountryNamed(Matcher<String> expected) {
		return new FeatureMatcher<Country, String>(expected, "A country with name", "name") {
			protected String featureValueOf(Country actual) {
				return actual.getName();
			}
		};
	}


	class Country {

		private final String name;

		public Country(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}

	}


}




выхлоп:

Код: plaintext
1.
2.
3.
4.
java.lang.AssertionError: 
Expected: iterable containing [A country with name "USA", A country with name "Mexico"]
     but: item 1: name was "Canada"


заметьте, что:
- никаких преобразований списков одних сущностей в наборы других
- точное соответствие поставленным целям
- текст сообщения об ошибке говорит сам за себя, а не какая-то пустота в случае Assert.true()
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800198
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловSergunkaНу, надо подфиксить метод типо так, чтоб было тождественное равенство

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	@Then("^a list of countries MUST be returned _ADS_$")
	public void a_list_of_counries_MUST_be_returned__ADS_(List<String> countries) throws Throwable {
		Set<String> set = new HashSet<String>();
		Set<String> set1 = new HashSet<String>(countries);
		for (Country c : this.countries) set.add(c.getName());
		Assert.isTrue(set.containsAll(set1));
                Assert.isTrue(set1.containsAll(set));
	}

Вы еще день будете осознавать, что сравнение наборов - это не то же самое что сравнение списков.

SergunkaПо понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое
Демонстрирую мастер-класс на примере того как должен был выглядеть ваш сценарий:

Код: 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.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.IsEqual.equalTo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.testng.annotations.Test;

/**
 * @author Andrey B. Panfilov <andrey@panfilov.tel>;
 */
public class HamcrestDemo {


	@Test
	public void demo() {
		List<Country> countryList = Arrays.asList(new Country("USA"), new Country("Canada"));
		List<String> expectedNames = Arrays.asList("USA", "Mexico");
		assertThat(countryList, hasSize(expectedNames.size()));
		assertThat(countryList, contains(HamcrestDemo::aCountryNamed, expectedNames));
	}


	public static <E, V> Matcher<Iterable<? extends E>> contains(Function<Matcher<V>, Matcher<E>> func, List<V> items) {
		List<Matcher<? super E>> matchers = new ArrayList<>();
		for (V item : items) {
			matchers.add(func.apply(equalTo(item)));
		}
		return IsIterableContainingInOrder.contains(matchers);
	}

	public static Matcher<Country> aCountryNamed(Matcher<String> expected) {
		return new FeatureMatcher<Country, String>(expected, "A country with name", "name") {
			protected String featureValueOf(Country actual) {
				return actual.getName();
			}
		};
	}


	class Country {

		private final String name;

		public Country(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}

	}


}




выхлоп:

Код: plaintext
1.
2.
3.
4.
java.lang.AssertionError: 
Expected: iterable containing [A country with name "USA", A country with name "Mexico"]
     but: item 1: name was "Canada"


заметьте, что:
- никаких преобразований списков одних сущностей в наборы других
- точное соответствие поставленным целям
- текст сообщения об ошибке говорит сам за себя, а не какая-то пустота в случае Assert.true()

Иными словами Вам удалось освоить JUnit test... поздравляю нормальный результат... есть куда рости
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800218
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergunka,

Мне ваши тесты нравятся.

Про себя unit test-ы мне всегда нравились и когда есть время пишу с удовольствием. Появление всяких mock-ов, я видимо так и не осилил. Я не понимаю зачем тестировать контроллеры, когда в них вся реализация сервисов подменена. На мой взгляд это тестирование тестового кода. И целосообразность подмены вижу только чтобы тестировать отказы (выбрасывая Exception).

Недавно открыл для себя test containers. Поэтому новый модуль который пишу постараюсь покрыть приемочными тестами на (TestContainers + Selenium). Ну и возможно BDD, но тут еще посмотрим.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800219
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0Sergunka,

Мне ваши тесты нравятся.

Про себя unit test-ы мне всегда нравились и когда есть время пишу с удовольствием. Появление всяких mock-ов, я видимо так и не осилил. Я не понимаю зачем тестировать контроллеры, когда в них вся реализация сервисов подменена. На мой взгляд это тестирование тестового кода. И целосообразность подмены вижу только чтобы тестировать отказы (выбрасывая Exception).

Недавно открыл для себя test containers. Поэтому новый модуль который пишу постараюсь покрыть приемочными тестами на (TestContainers + Selenium). Ну и возможно BDD, но тут еще посмотрим.
Моки нужны чтобы подменять сложные источники данных которые в фазе модульного тестинга
недоступны (базы данных и внешние веб-сервисы).

Во всех остальных случаях внедрение моков в тест нужно очень сильно обосновывать т.к. здесь
может быть скрыта немалая часть архитектурных ошибок и упущений.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800228
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0Недавно открыл для себя test containers. Поэтому новый модуль который пишу постараюсь покрыть приемочными тестами на (TestContainers + Selenium). Ну и возможно BDD, но тут еще посмотрим.

У меня друг тестировщик недавно перешел на карате для тестирования Rest API

https://github.com/intuit/karate

Говорит, что очень просто и крепко сделанный продукт опять же с огурцами

Может кому подойдет походу.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800229
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

За свой опыт не видел ни один проект, в котором мне использование моков бы понравилось. При взгляде на который бы сказал "Да классно сделано".

Тот код который я видел обычно называют код с душком. Мок на моке сидит и моком погоняет. И непонятно что там вообще тестируется. При этом подготовка моков это целые "портянки кода".

Еще один недостаток в том что любое изменение очень сильно бьет по всем тестам. На мой взгляд лучше время на приемочные тесты тратить они более высокоуровневые и меньше подвержены внутренним изменениям. Ну и покрыв основные сценарии, получаешь хорошие регрессионные тесты.
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800240
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0mayton,

За свой опыт не видел ни один проект, в котором мне использование моков бы понравилось. При взгляде на который бы сказал "Да классно сделано".

Тот код который я видел обычно называют код с душком. Мок на моке сидит и моком погоняет. И непонятно что там вообще тестируется. При этом подготовка моков это целые "портянки кода".

Еще один недостаток в том что любое изменение очень сильно бьет по всем тестам. На мой взгляд лучше время на приемочные тесты тратить они более высокоуровневые и меньше подвержены внутренним изменениям. Ну и покрыв основные сценарии, получаешь хорошие регрессионные тесты.
Можешь показать эти "портянки кода" ?
...
Рейтинг: 0 / 0
Тестирование. Что именно тестировать? Как определить середину?
    #39800243
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ну это примерно вот такие вещи
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    private void mockService(NotifierContext context) throws Exception {
        for (int i = 0; i < context.businessUsers.size(); i++) {
            final String iin = context.businessUsers.get(i).getIin();
            final String email = context.users.get(i).getEmail();
            final String enterpriseTin = context.businessUsers.get(i).getTin();

            when(userDao.getUser(iin, LocaleUtils.RU)).thenReturn(context.users.get(i));
            when(enterpriseAdminChangeMessageGenerator.generate(email, enterpriseTin, iin, context.daysBeforeBlock)).thenReturn(context.notifyMessage);
            when(blockEnterpriseMessageGenerator.generate(email, enterpriseTin, iin)).thenReturn(context.blockMessage);
        }
    }
...
Рейтинг: 0 / 0
25 сообщений из 361, страница 8 из 15
Форумы / Java [игнор отключен] [закрыт для гостей] / Тестирование. Что именно тестировать? Как определить середину?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]