Автор оригинала: Tadayuki Tanigawa.
Что это?
Мы должны написать много кода и тестов.
Иногда нам нужно поддерживать огромный и сложный код, а также тесты, которые следуют изменения, когда деловые ситуации меняются так быстро.
Слишком сложно писать и хранить качественный код теста, когда столкнулся с сложной бизнес-логикой.
Мы кодеры Отказ Давайте исправим эти проблемы с генератором, чтобы легко и быстро сделать тесты.
После изучения этого метода вы можете легко масштабироваться в этих ситуациях.
Для пользователей Windows
- Github клон
пряжа
пряжа watch_xlsx.
- Определите свои сложные бизнес-шаблоны в XLSX.
- Изменить generate_test_case.rb, чтобы делать то, что вам нужно.
- Скопируйте сгенерированный тестовый код в ваш проект.
- Запустите и измените данные, которые вы хотите.
Для пользователей без окон
- Клон от Гадость
пряжа
пряжа watch_csv.
- Определите свои сложные бизнес-шаблоны в CSV.
- Изменить generate_test_case.rb, чтобы делать то, что вам нужно.
- Скопируйте сгенерированный тестовый код в ваш проект.
- Запустите и измените данные, которые вы хотите.
Подготовьтесь к использованию
Клон от github
Откройте свой терминал или командную строку.
git clone https://github.com/panghea/testcasegenerator
Пример
Этот пример – рабочий процесс для упаковок элемента. Упаковка элемента определяется категорией элемента и типом судов товара. Есть пять маршрутов, чтобы одобрить доставку товара для пакета.
Код примера
public class Routes { // result for Package Type public String packageType; public void approveA(Item item) { // approve with Item Category and Ship Type // process data and write to the database.... // if the final approve flow record package type to this.packageType } public void approveB(Item item) { // approve with Item Category and Ship Type // process data and write to the database.... // if the final approve flow record package type to this.packageType } public void approveC(Item item) { // approve with Item Category and Ship Type // process data and write to the database.... // if the final approve flow record package type to this.packageType } public void approveD(Item item) { // approve with Item Category and Ship Type // process data and write to the database.... // if the final approve flow record package type to this.packageType } public void approveE(Item item) { // approve with Item Category and Ship Type // process data and write to the database.... // if the final approve flow record package type to this.packageType } public String Reject(Item item) { // reject workflow when somthing happend at bussiness working. // clean up data and record where to reject approve process to the database return approveProcessName; } }
Вот пример данных Excel (вход/data_pattern.xlsx)
Пакет C1. | Тип судна B. | пропускать | нужно | пропускать | пропускать | нужно | Категория А. |
Пакет C2. | Тип судна C. | нужно | нужно | пропускать | нужно | нужно | Категория А. |
Пакет A2. | Тип судна D. | нужно | нужно | нужно | нужно | нужно | Категория А. |
Пакет A3. | Тип судна C. | пропускать | пропускать | пропускать | пропускать | нужно | Категория А. |
Пакет C1. | Тип корабля А. | нужно | нужно | пропускать | нужно | нужно | Категория B. |
Пакет A2. | Тип судна B. | пропускать | нужно | нужно | нужно | нужно | Категория B. |
Пакет B7. | Тип судна F. | нужно | нужно | пропускать | нужно | нужно | Категория B. |
Пакет B4. | Тип судна B. | нужно | нужно | нужно | нужно | нужно | Категория C. |
Пакет A3. | Тип корабля А. | нужно | нужно | пропускать | пропускать | нужно | Категория C. |
Пакет C2. | Тип судна F. | пропускать | нужно | пропускать | нужно | пропускать | Категория D. |
Пакет D1. | Тип судна G. | пропускать | нужно | пропускать | пропускать | нужно | Категория D. |
Пакет F2. | Тип корабля А. | нужно | пропускать | пропускать | пропускать | пропускать | Категория E. |
Вот пример данных CSV (вход/data_pattern_csv.yaml)
Он пишет CSV внутри YAML, что полезно для чтения и редактирования для людей и преобразователей.
data_csv: - ["Category A","Ship Type B","skip","need","skip","skip","need","Package C1"] - ["Category A","Ship Type C","need","need","skip","need","need","Package C2"] - ["Category A","Ship Type D","need","need","need","need","need","Package A2"] - ["Category A","Ship Type C","skip","skip","skip","skip","need","Package A3"] - ["Category B","Ship Type A","need","need","skip","need","need","Package C1"] - ["Category B","Ship Type B","skip","need","need","need","need","Package A2"] - ["Category B","Ship Type F","need","need","skip","need","need","Package B7"] - ["Category C","Ship Type B","need","need","need","need","need","Package B4"] - ["Category C","Ship Type A","need","need","skip","skip","need","Package A3"] - ["Category D","Ship Type F","skip","need","skip","need","skip","Package C2"] - ["Category D","Ship Type G","skip","need","skip","skip","need","Package D1"] - ["Category E","Ship Type A","need","skip","skip","skip","skip","Package F2"]
Создайте YAML из каждого файла данных (Excel или CSV)
Создайте YAML из файлов XLSX (только для Windows)
Если вы используете Windows, вы можете генерировать YAML из XLSX.
cd testcasegenerator ruby xlsx2yaml.rb
Генерировать YAML из файла CSV
Если вы не используете Windows, вы можете генерировать YAML из CSV.
cd testcasegenerator ruby csv2yaml.rb
Выходной файл YAML
Сгенерированный/Generator_input.yaml.
--- - ItemCategory: Category A ItemShipType: Ship Type B ApproveRouteA: skip ApproveRouteB: need ApproveRouteC: skip ApproveRouteD: skip ApproveRouteE: need PackageType: Package C1 - ItemCategory: Category A ItemShipType: Ship Type C ApproveRouteA: need ApproveRouteB: need ApproveRouteC: skip ApproveRouteD: need ApproveRouteE: need PackageType: Package C2 ...
Создайте файл тестового случая из файла yaml
ruby generate_test_case.rb
Источник генератора
Требуется всего несколько кодов для генерации тестовых случаев.
def generateTestCase(testCase) outputCodes = [] # write method header outputCodes.push(<<-GENERATOR.gsub(/^$/,"") /* * Test Case Of [#{testCase["ItemCategory"]}] and [#{testCase["ItemShipType"]}]
** ====================================================== * 2017/09/15 Tadayuki Tanigawa ** @throws Throwable */ @Test public void testCase#{"%02d" % (testCase['caseNo']+ 1)}_#{testCase['ItemCategory'].gsub(/ /,"_")}_#{testCase['ItemShipType'].gsub(/[- ]/,"_")}() throws Throwable { // prepare for test data by route GENERATOR ); # prepare data for each route outputCodes.push(prepareTestData(testCase).join()) # do test methods outputCodes.push(<<-GENERATOR // create item Item item = new Item(); item.setCategory("#{testCase["ItemCategory"].gsub(/.* /,"")}"); item.setShipType("#{testCase["ItemShipType"].gsub(/.* /,"")}"); // call each route Routes routes = new Routes(); GENERATOR ) outputCodes.push(testRouteCall(testCase).join()) # assert test result outputCodes.push(<<-GENERATOR // assert package type assertThat("Package Type", routes.packageType, is("#{testCase["PackageType"].gsub(/.* /,"")}")); GENERATOR ) outputCodes.push(<<~GENERATOR #{testCase["Assertions"]} GENERATOR ) outputCodes.push(<<-GENERATOR } GENERATOR ) outputCodes end
Сгенерированный код
Это сгенерированный метод теста путем Generate_Test_Case.rb.
Если вам нужно добавить маршруты в ваши бизнес-правила, легко создавать тесты, используя генератор. Вы просто добавляете новый маршрут элемента как строка в XLSX или CSV.
/* * Test Case Of [Category B] and [Ship Type F]
** ====================================================== * 2017/09/15 Tadayuki Tanigawa ** @throws Throwable */ @Test public void testCase07_Category_B_Ship_Type_F() throws Throwable { // prepare for test data by route // For Route A insert or update data to the Database dao.update("Update ItemRouteTable ... RouteName = 'ApproveRouteA' ,itemCategory = 'Category B'...."); // For Route B insert or update data to the Database dao.insert("Insert RouteTable ... SELECT 'B' AS RouteType ,'Category B' as ItemCategory...."); dao.update("Update ItemCategoryTable ... itemCategory = 'Category B Where itemShipType = 'Ship Type F'") dao.update("Update ItemRouteTable ... RouteName = 'ApproveRouteB' ,itemCategory = 'Category B'...."); // For Route D insert or update data to the Database dao.insert("Insert RouteTable ... SELECT 'D' AS RouteType ,'Category B' as ItemCategory...."); dao.update("Update ItemRouteTable ... RouteName = 'ApproveRouteD' ,itemCategory = 'Category B'...."); // For Route E insert or update data to the Database dao.insert("Insert RouteTable ... SELECT 'E' AS RouteType ,'Category B' as ItemCategory...."); dao.update("Update ItemRouteTable ... RouteName = 'ApproveRouteE' ,itemCategory = 'Category B'...."); // create item Item item = new Item(); item.setCategory("B"); item.setShipType("F"); // call each route Routes routes = new Routes(); // approve by A route.approveA(item); // approve by B route.approveB(item); // approve by D route.approveD(item); // approve by E route.approveE(item); // assert package type assertThat("Package Type", routes.packageType, is("B7")); }
Автоматически генерировать код при сохранении xlsx или csv
Он наблюдает за модификацией файлов и автоматически выполняет Ruby. Вы просто редактируете Generate_test_Case.rb или data_pattern.xlsx или data_pattern_csv.yaml!
Для окон
npm install -g yarn yarn watch_xlsx
Для других
npm install -g yarn yarn watch_csv
Следующий
Вы можете добавить пользовательские выражения, которые относятся к данным или утверждению тестового кода в YAML для действительно сложных испытаний.
Изменить generate_test_case.rb.
Затем генерируйте код:
Вы можете определить правила YAML и легко генерировать результаты.
Вы можете написать документы Excel от YAML таким образом! Это действительно полезно! Если вы заинтересованы, позвоните мне!
Часто задаваемые вопросы
Зачем использовать YAML для поколения?
- YAML проще модифицировать, чем CSV и XLSX в текстовом редакторе.
- YAML – это текстовый файл, который легко управлять на Git.
- Если XLSX или CSV сломан, мы можем повторно генерировать из YAML в каждый файл – просто сделайте генератор для XLSX или CSV.
- Ямл читает быстрее, а затем XLSX от Ruby. Мы иногда занимаемся большим размером XLSX файлами.
Зачем использовать Ruby?
- Здесь документ Ruby потрясающий для генерации кода.
- Ruby хорош для автоматизации Excel до сих пор.