Инструмент/метод для автоматической генерации модульных тестов на основе предварительных/постусловий метода

Интересно, есть ли какой-нибудь инструмент, который автоматически генерирует модульные тесты на основе предварительных и постусловий метода (и инварианта класса).

Чтобы быть точным, предположим, что нам даны предварительные и постусловия (и, возможно, инвариант класса) для метода, и мы хотим сгенерировать модульные тесты на основе этой информации. Я ищу практический инструмент для этой цели.

Я знаю Кората и TestWizard. Не могли бы вы назвать еще несколько техник/инструментов?

PS: язык программирования или язык, на котором мы указываем контракты методов, не так важен. Я просто хочу знать о методах.

Спасибо.


person RealNamesOrHandles    schedule 03.02.2019    source источник
comment
В мире .net Pex раньше делал это, но я не знаю, поддерживается ли он до сих пор: microsoft.com/en-us /исследование/проект/   -  person vc 74    schedule 03.02.2019
comment
@ vc74, спасибо за упоминание Pex :) Я думаю, что Pex генерирует тесты на основе параметризованных методов тестирования, а не на основе контрактов методов. Если вы уверены, что они добавили то, что я ищу, пожалуйста, дайте мне знать.   -  person RealNamesOrHandles    schedule 03.02.2019
comment
Он также генерирует тесты на основе кодовых контрактов, хотя документацию по этому вопросу в наши дни трудно найти. Вот пример: blogs.u2u.be/peter/post/Pex- и кодовые контракты   -  person vc 74    schedule 03.02.2019
comment
Спасибо за ссылку; Я не знал об этом. Но он все еще не делает то, что именно я хочу. Исходя из того, что я понял из статьи, которую вы привели в качестве примера, контракты кода не используются для генерации тестовых случаев, вместо этого они используются для того, чтобы направлять Pex, чтобы избежать бессмысленных входных данных.   -  person RealNamesOrHandles    schedule 03.02.2019


Ответы (2)


Randoop делает это. В его руководстве рассказывается, как указать - и постусловия.

В комментарии вы провели различие между "созданием" и "направлением"; Я не уверен, что именно вы имеете в виду, но вы можете рассматривать Randoop как руководство, использующее спецификации.

person mernst    schedule 03.02.2019
comment
Спасибо, профессор Эрнст, за упоминание этой (новой?) функции Randoop:) Это определенно поможет мне, особенно. потому что Randoop — надежный инструмент. Что касается вашего сомнения по поводу моего комментария, я бы сказал, что в Randoop история совершенно другая. Pex требует, чтобы пользователь предоставил PUT, а затем использует контракты кода для управления генерацией тестовых случаев (вероятно, предоставляя дополнительную информацию базовому решателю SMT). Но Randoop не нуждается в PUT и намного ближе к тому, что я ищу. - person RealNamesOrHandles; 03.02.2019

Одно из исследований в этой области проводилось в 2005-2011 гг. в ETH с целью создания «Контрактного инструмента случайного тестирования», также известного как Автотест. Он был разработан для Eiffel, где предусловия, постусловия и инварианты классов являются частью языка. Инструмент использует их в качестве спецификации для автоматического создания тестов. Инструмент был интегрирован со средой разработки EiffelStudio, где он использует контракты для 3 видов тестов:

  • руководство — хороший «олдскульный» подход к написанию тестов разработчиками;
  • извлечено — как только происходит нарушение контракта, инструмент может сгенерировать соответствующий тест-кейс;
  • generated: инструмент автоматически синтезирует новые тесты, проверяя выполнение предварительных условий и инвариантов классов на вход в подпрограмму и проверка отсутствия ошибок при возврате, в частности, отсутствия нарушения постусловия или инварианта класса.
person Alexander Kogtenkov    schedule 03.02.2019
comment
Спасибо, доктор Когтенков:) Мне точно поможет, сэр. Прошло много времени с тех пор, как я читал статью AutoTest, но я думаю, что мы можем думать об этом как о Randoop для Eiffel, верно? - person RealNamesOrHandles; 03.02.2019
comment
Я не знаю подробностей, т.е. поддерживает ли Randoop извлеченные тесты. С внешней стороны контракты, известные Randoop, являются бит ограничен, тогда как код Eiffel с самого начала поставляется с обширными контрактами. Исторически исследования проводились более или менее в одни и те же сроки. Я понятия не имею, влияли ли и как обе группы друг на друга. - person Alexander Kogtenkov; 03.02.2019