Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 [8] 9 10 11 12 .. 15   вперед  Ctrl
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7516
Petro123
зачем так узко?

дело не в узко, а в том, что я тогда вообще не понимаю, что у людей лежит в src/test )))

Для меня, src/test в первую очередь "проверка того, что не нарушилась работоспособность работающей ранее функциональности, если её код мог быть затронут при исправлении некоторых дефектов в другой функциональности" ( C ) wiki
11 апр 19, 15:30    [21859611]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
andreykaT
Member

Откуда:
Сообщений: 1884
тут некоторые 1500 раз свой код запускают поэтому им эти твои проверки ни разу не нужны. да и вообще тесты это потеря времени. ты о чем воще.
11 апр 19, 15:49    [21859625]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
mayton
Member

Откуда: loopback
Сообщений: 39868
andreykaT
тут некоторые 1500 раз свой код запускают поэтому им эти твои проверки ни разу не нужны. да и вообще тесты это потеря времени. ты о чем воще.

Я с трудом себе представляю как можно после крупного рефакторинга
по "щелчку пальцев" определить что ничего не сломалось.

Мне кажется - только автоматизация. Кто там 1500 раз делает?
Покажите мне этого человека. И что он это делает каждый день?
Или по изменению?
11 апр 19, 15:53    [21859632]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
andreykaT,
Ты проснулся. Поздравляю.
Если такие как ты говорят что тестируют, то пусть расскажут как.
Где твой интеграционный?
11 апр 19, 16:13    [21859662]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
mayton
Кто там 1500 раз делает?
я делаю))).
Но я готов покаятся, если будет автоматизация.
Никто не показал.
Один пример выше был, там dsl и огурцы учить надо).
11 апр 19, 16:16    [21859668]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
mayton
Member

Откуда: loopback
Сообщений: 39868
Petro123
mayton
Кто там 1500 раз делает?
я делаю))).
Но я готов покаятся, если будет автоматизация.
Никто не показал.
Один пример выше был, там dsl и огурцы учить надо).

Дай бох. Я надеюсь что про 1500 раз ты пошутил.
11 апр 19, 16:17    [21859669]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
mayton,
if на пять веток напишу и 5 раз запускаю.
Раз в 5 минут примерно запускаю.
11 апр 19, 16:19    [21859674]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
mayton
надеюсь что про 1500 раз ты пошутил.
надеюсь про то что запуск 10 мин. Тут тоже шутят?
11 апр 19, 16:20    [21859677]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
mayton
Member

Откуда: loopback
Сообщений: 39868
Petro123
mayton
надеюсь что про 1500 раз ты пошутил.
надеюсь про то что запуск 10 мин. Тут тоже шутят?

Смотря что. Биржевая система греет кеши примерно 20 минут.
Для поднятия в стеке Jenkins. Но это для end-to-end.
11 апр 19, 16:29    [21859689]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
mayton
Но это для end-to-end.
вот и я говорю. Все про крайности.
Я про 1500 запусков. Другой про 10мин и он пишет по памяти-тестам с черной повязкой. Третий с огурцами)
11 апр 19, 16:49    [21859715]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
казинак
Member

Откуда:
Сообщений: 1250
alex55555
казинак
а откуда взялся "дополнительный, таки не протестированный метод" ?

От прошлых подвигов, например.

Тебе надо понять одно - программирование не заканчивается на одном единственном кейсе. И не начинается с одного единственного кейса. Это процесс. Он долгий. Кейсов много. И они наслаиваются. И когда кто-то поступает по твоему, то всегда получает косяки из-за наслоений, потому что проверяет только то, что ему кто-то написал в данном кейсе.

это в ипанутых системах они наслаиваются
патамушта там поклоняются фаулеру и пишут километры оберток (лейеров),
то бишь универсальных классов, которые должны использоваться ВЕЗДЕ

а в норм системах, парэкзампль, изменение в логике начисления процентов не сломает заведение договоров
патамушто норм система реализована модульно, и в случае выхода из строя одного модуля, другие не ломаются
11 апр 19, 18:14    [21859808]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
Sergunka
Member

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

Сценарий:
    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 _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 будет только мешаться)
  • в-третьих, "корректность" реализации теста отдается на откуп непонятно кому: вот у вас в сценарии написано что должен прийти список из трех стран, а вы проверяете только вхождение одного набора в другой, т.е. если в вашем тесте сервис вернет больше стран или дубли, то тест все равно будет успешным - ну и зачем такой тест нужен?


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


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

    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

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

    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
    


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

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

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

    Но поймите этот код я опубликовал несколько для других целей кроме того как поделится как у нас в конторе дело обстоит хотелось бы услышать как это дело обстоит в других конторах. Моему коду уже без малого лет пять неужели никто так особо и не продвинулся из уважаемой публики?!
    11 апр 19, 18:32    [21859832]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Sergunka
    Member

    Откуда:
    Сообщений: 1735
    Petro123

    Один пример выше был, там dsl и огурцы учить надо).


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

    Просто когда над проектом работают две\три комманды по человек пять другого варианта я просто не вижу.
    11 апр 19, 18:39    [21859837]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Андрей Панфилов
    Member

    Откуда: Москва > Melbourne
    Сообщений: 3182
    Sergunka
    Извините, Вы специально вырвали из контекста сам тест?
    Так вы чтоли не поняли что ваши тесты неправильные? Давайте еще раз:
    	@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));
    	}
    
    Ожидание сценария: должен вернуться определенный список стран
    Реализация теста: в возвращенном списке стран присутствуют ожидаемые
    т.е. если вот в этом сценарии:
        When a user queries a list of countries by city name "Vancouver" _ADS_
        Then a list of countries should be returned _ADS_
        | USA    |
        | Canada |
    
    Сервис вернет еще и Мексику, то тест все равно пройдет - такие тесты не нужны, никому, совсем.
    11 апр 19, 18:51    [21859851]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Sergunka
    Member

    Откуда:
    Сообщений: 1735
    Андрей Панфилов
    Sergunka
    Извините, Вы специально вырвали из контекста сам тест?
    Так вы чтоли не поняли что ваши тесты неправильные? Давайте еще раз:
    	@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));
    	}
    
    Ожидание сценария: должен вернуться определенный список стран
    Реализация теста: в возвращенном списке стран присутствуют ожидаемые
    т.е. если вот в этом сценарии:
        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. Ну, так спасибо, конечно, поржал
    11 апр 19, 19:47    [21859884]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Андрей Панфилов
    Member

    Откуда: Москва > Melbourne
    Сообщений: 3182
    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. Ну, так спасибо, конечно, поржал
    Вот зачем вы что-то пишете про Генри Форда, если сами не в состоянии сравнить два сраных списка? Очередная попытка:
    	@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 - то что пришло из сервиса:
    	@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.
    11 апр 19, 19:58    [21859888]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Sergunka
    Member

    Откуда:
    Сообщений: 1735
    Андрей Панфилов
    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. Ну, так спасибо, конечно, поржал
    Вот зачем вы что-то пишете про Генри Форда, если сами не в состоянии сравнить два сраных списка? Очередная попытка:
    	@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 - то что пришло из сервиса:
    	@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.


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

    	@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]");
    	}
    



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

    	@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));
    	}
    


    По понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое
    11 апр 19, 20:46    [21859913]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Андрей Панфилов
    Member

    Откуда: Москва > Melbourne
    Сообщений: 3182
    Sergunka
    Ну, надо подфиксить метод типо так, чтоб было тождественное равенство

    	@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
    По понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое

    Демонстрирую мастер-класс на примере того как должен был выглядеть ваш сценарий:

    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;
    		}
    
    	}
    
    
    }
    



    выхлоп:


    java.lang.AssertionError:
    Expected: iterable containing [A country with name "USA", A country with name "Mexico"]
    but: item 1: name was "Canada"


    заметьте, что:
    - никаких преобразований списков одних сущностей в наборы других
    - точное соответствие поставленным целям
    - текст сообщения об ошибке говорит сам за себя, а не какая-то пустота в случае Assert.true()
    11 апр 19, 21:33    [21859942]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Sergunka
    Member

    Откуда:
    Сообщений: 1735
    Андрей Панфилов
    Sergunka
    Ну, надо подфиксить метод типо так, чтоб было тождественное равенство

    	@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
    По понятным причинам Вы не удосужились показать как у вас пишут тесты. Очень жаль надеялся увидеть, что-то исключительно героическое

    Демонстрирую мастер-класс на примере того как должен был выглядеть ваш сценарий:

    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;
    		}
    
    	}
    
    
    }
    



    выхлоп:


    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... поздравляю нормальный результат... есть куда рости
    11 апр 19, 22:08    [21859967]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    vas0
    Member

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1160
    Sergunka,

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

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

    Недавно открыл для себя test containers. Поэтому новый модуль который пишу постараюсь покрыть приемочными тестами на (TestContainers + Selenium). Ну и возможно BDD, но тут еще посмотрим.
    11 апр 19, 23:23    [21860004]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39868
    vas0
    Sergunka,

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

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

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

    Моки нужны чтобы подменять сложные источники данных которые в фазе модульного тестинга
    недоступны (базы данных и внешние веб-сервисы).

    Во всех остальных случаях внедрение моков в тест нужно очень сильно обосновывать т.к. здесь
    может быть скрыта немалая часть архитектурных ошибок и упущений.
    11 апр 19, 23:31    [21860005]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    Sergunka
    Member

    Откуда:
    Сообщений: 1735
    vas0
    Недавно открыл для себя test containers. Поэтому новый модуль который пишу постараюсь покрыть приемочными тестами на (TestContainers + Selenium). Ну и возможно BDD, но тут еще посмотрим.


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

    https://github.com/intuit/karate

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

    Может кому подойдет походу.
    11 апр 19, 23:50    [21860017]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    vas0
    Member

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1160
    mayton,

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

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

    Еще один недостаток в том что любое изменение очень сильно бьет по всем тестам. На мой взгляд лучше время на приемочные тесты тратить они более высокоуровневые и меньше подвержены внутренним изменениям. Ну и покрыв основные сценарии, получаешь хорошие регрессионные тесты.
    11 апр 19, 23:53    [21860018]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39868
    vas0
    mayton,

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

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

    Еще один недостаток в том что любое изменение очень сильно бьет по всем тестам. На мой взгляд лучше время на приемочные тесты тратить они более высокоуровневые и меньше подвержены внутренним изменениям. Ну и покрыв основные сценарии, получаешь хорошие регрессионные тесты.

    Можешь показать эти "портянки кода" ?
    12 апр 19, 00:19    [21860038]     Ответить | Цитировать Сообщить модератору
     Re: Тестирование. Что именно тестировать? Как определить середину?  [new]
    vas0
    Member

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1160
    mayton,

    ну это примерно вот такие вещи
        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);
            }
        }
    
    12 апр 19, 00:45    [21860048]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 [8] 9 10 11 12 .. 15   вперед  Ctrl
    Все форумы / Java Ответить