Reportes en Jenkins

Si bien últimamente vengo trabajando muy felizmente con Travis, una de las funcionalidades que extraño mucho son los reportes. Cuando trabajo con Jenkins suelo hacer que mis jobs de CI muestren diversos reportes.

Hay dos estrategias para mostrar reportes en Jenkins:

  1. Utilizar las capacidades de reporting de Jenkins, ya sea nativas o con plugins, o bien
  2. Hacer que cada herramienta que forma parte del build genere sus propios reportes y luego simplemente hacer que Jenkins provea acceso a dichos reportes.

Un ejemplo del primer caso es el plugin de Cucumber-jvm que genera un reporte como el de la figura 1.

cucumber_jenkins
Figura 1

Un ejemplo similar pero usando la segunda estrategia sería ejecutar cucumber especificando que genere output HTML y luego usar el plugin Sidebar link de Jenkins para linkear el reporte generado por cucumber. En figura 2 se ve un caso de esta estrategia donde Jenkins provee links un reporte de features generado por cucumber y otro de coverage generado por SimpleCov. La figura 3 muestra cómo configurar los links a los reportes una vez instalado el plugin.

reportes_jenkins
Figura 2

 

sidebar_links
Figura 3

 

7 comentarios en “Reportes en Jenkins

  1. Hola Nico,

    Gracias por el post! Con mi equipo estamos usando el plugin de Cucumber JVM para Jenkins. En general estamos contentos. Pero creemos que hay que usarlo con ciertos cuidados, ya que todavía está un poco verde.
    Hemos detectado algunos bugs y nos vimos obligados a intentar distintas alternativas de uso. Principalmente tuvimos problemas con la generación de features con background y con la generación del reporte cuando no usamos el lenguaje default (trabajamos para un cliente local con lo cual escribimos las specs en español).
    No obstante, a pesar de estas cuestiones recomendamos usar el plugin. Encontramos que aporta muchísimo valor a nuestro proceso de desarrollo.
    Saludos!

    1. Interesante, gracias por la data.
      De paso te consulto, ¿Que IDE utilizan para desarrollo? ¿Le pusieron algún plugin para Cucumber?

      Saludos!

      1. Hola Nico! Colgué con la respuesta… algunos meses!! =P

        Como IDE estamos usando Eclipse, sin plugins para Cucumber. Corremos todo con Maven o Graddle (dependiendo del caso) siempre desde la consola. Para escribir las specs usamos Sublime Text y un plugin que te colorea la sintaxis de Gherkin y queda todo muy bonito. Entiendo que en el presente hay un plugin para Eclipse pero no lo probé.

        Por otra parte (y ya no con mi equipo de desarrollo) en el contexto de Python y Lettuce empleo PyCharm con un plugin para sintaxis de Gherkin. Es idéntico al de Specflow! (que usé en menor medida, ya que no me especializo en .Net por cuestión de principios! =P)

        Un abrazo!

      2. Interesante lo de plugin de Sublime, lo voy a buscar.
        Curiosidad ¿probaron JBehave? ¿Por alguna razón se inclinaron por Cucumber-JVM en lugar de JBehave?

  2. Buenas! Por si no encontraste el plugin de Gherkin para Sublime Text, acá va: .gist table { margin-bottom: 0; } This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt; <plist version="1.0"> <dict> <key>fileTypes</key> <array> <string>feature</string> </array> <key>firstLineMatch</key> <string>기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функционалност|Функционал|Особина|Могућност|Özellik|Właściwość|Tính năng|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Egenskap|Egenskab|Crikey|Característica|Arwedd(.*)</string> <key>foldingStartMarker</key> <string>^s*b(예|시나리오 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|例子|例|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|サンプル|سيناريو مخطط|سيناريو|امثلة|الخلفية|תרחיש|תבנית תרחיש|רקע|דוגמאות|Тарих|Сценарій|Сценарији|Сценарио|Сценарий структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на сценарий|Примери|Пример|Приклади|Предыстория|Предистория|Позадина|Передумова|Основа|Мисоллар|Концепт|Контекст|Значения|Örnekler|Założenia|Wharrimean is|Voorbeelden|Variantai|Tình huống|The thing of it is|Tausta|Taust|Tapausaihio|Tapaus|Tapaukset|Szenariogrundriss|Szenario|Szablon scenariusza|Stsenaarium|Struktura scenarija|Skica|Skenario konsep|Skenario|Situācija|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello scenario|Scenārijs pēc parauga|Scenārijs|Scenár|Scenariusz|Scenariul de şablon|Scenariul de sablon|Scenariu|Scenarios|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenariji|Scenarijaus šablonas|Scenarijai|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Primer|Pozadí|Pozadina|Pozadie|Plan du scénario|Plan du Scénario|Piemēri|Pavyzdžiai|Paraugs|Osnova scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Kịch bản|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Juhtumid|Háttér|Grundlage|Geçmiş|Forgatókönyv vázlat|Forgatókönyv|Exemplos|Exemples|Exemplele|Exempel|Examples|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esempi|Escenario|Escenari|Enghreifftiau|Eksempler|Ejemplos|EXAMPLZ|Dữ liệu|Dis is what went down|Dasar|Contoh|Contexto|Contexte|Contesto|Condiţii|Conditii|Cobber|Cenário|Cenario|Cefndir|Bối cảnh|Blokes|Beispiele|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|All y'all|Achtergrond|Abstrakt Scenario|Abstract Scenario)</string> <key>foldingStopMarker</key> <string>^s*$</string> <key>keyEquivalent</key> <string>^~C</string> <key>name</key> <string>Gherkin</string> <key>patterns</key> <array> <dict> <key>include</key> <string>#feature_element_keyword</string> </dict> <dict> <key>include</key> <string>#feature_keyword</string> </dict> <dict> <key>include</key> <string>#step_keyword</string> </dict> <dict> <key>include</key> <string>#strings_triple_quote</string> </dict> <dict> <key>include</key> <string>#strings_single_quote</string> </dict> <dict> <key>include</key> <string>#strings_double_quote</string> </dict> <dict> <key>include</key> <string>#comments</string> </dict> <dict> <key>include</key> <string>#tags</string> </dict> <dict> <key>include</key> <string>#scenario_outline_variable</string> </dict> <dict> <key>include</key> <string>#table</string> </dict> </array> <key>repository</key> <dict> <key>comments</key> <dict> <key>captures</key> <dict> <key>0</key> <dict> <key>name</key> <string>comment.line.number-sign</string> </dict> </dict> <key>match</key> <string>s*(#.*)</string> </dict> <key>table</key> <dict> <key>begin</key> <string>^s*|</string> <key>end</key> <string>|s*$</string> <key>name</key> <string>keyword.control.cucumber.table</string> <key>patterns</key> <array> <dict> <key>match</key> <string>w</string> <key>name</key> <string>source</string> </dict> </array> </dict> <key>feature_keyword</key> <dict> <key>captures</key> <dict> <key>1</key> <dict> <key>name</key> <string>keyword.language.gherkin.feature</string> </dict> <key>2</key> <dict> <key>name</key> <string>string.language.gherkin.feature.title</string> </dict> </dict> <key>match</key> <string>^s*(기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функционалност|Функционал|Особина|Могућност|Özellik|Właściwość|Tính năng|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Egenskap|Egenskab|Crikey|Característica|Arwedd):(.*)b</string> </dict> <key>step_keyword</key> <dict> <key>captures</key> <dict> <key>1</key> <dict> <key>name</key> <string>keyword.language.gherkin.feature.step</string> </dict> </dict> <key>match</key> <string>^s*(하지만|조건|먼저|만일|만약|단|그리고|그러면|那麼|那么|而且|當|当|前提|假設|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|و |متى |لكن |عندما |ثم |بفرض |اذاً |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Унда |То |Припустимо що |Припустимо |Онда |Но |Нехай |Лекин |Когато |Када |Кад |К тому же |И |Задато |Задати |Задате |Если |Допустим |Дадено |Ва |Бирок |Аммо |Али |Але |Агар |А |І |Și |És |anrhegedig a |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Youse know when youse got |Youse know like when |Yna |Ya know how |Ya gotta |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |Và |Ve |Und |Un |Thì |Then y'all |Then |Tapi |Tak |Tada |Tad |Så |Stel |Soit |Siis |Si |Quando |Quand |Quan |Pryd |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Når |När |Niin |Nhưng |N |Mutta |Men |Mas |Maka |Majd |Mais |Maar |Ma |Lorsque |Lorsqu'|Kun |Kuid |Kui |Khi |Keď |Ketika |Když |Kai |Kada |Kad |Jeżeli |Ja |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben sei |Fakat |Eğer ki |Etant donné |Et |Então |Entonces |Entao |En |Eeldades |E |Duota |Dun |Donat |Donada |Diyelim ki |Dengan |Den youse gotta |De |Dato |Dar |Dann |Dan |Dado |Dacă |Daca |DEN |Când |Cuando |Cho |Cept |Cand |Cal |But y'all |But |Buh |Biết |Bet |BUT |Atès |Atunci |Atesa |Angenommen |And y'all |And |An |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Aber |AN |A také |A |* )</string> </dict> <key>feature_element_keyword</key> <dict> <key>captures</key> <dict> <key>1</key> <dict> <key>name</key> <string>keyword.language.gherkin.feature.scenario</string> </dict> <key>2</key> <dict> <key>name</key> <string>string.language.gherkin.scenario.title.title</string> </dict> </dict> <key>match</key> <string>^s*(예|시나리오 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|例子|例|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|サンプル|سيناريو مخطط|سيناريو|امثلة|الخلفية|תרחיש|תבנית תרחיש|רקע|דוגמאות|Тарих|Сценарій|Сценарији|Сценарио|Сценарий структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на сценарий|Примери|Пример|Приклади|Предыстория|Предистория|Позадина|Передумова|Основа|Мисоллар|Концепт|Контекст|Значения|Örnekler|Założenia|Wharrimean is|Voorbeelden|Variantai|Tình huống|The thing of it is|Tausta|Taust|Tapausaihio|Tapaus|Tapaukset|Szenariogrundriss|Szenario|Szablon scenariusza|Stsenaarium|Struktura scenarija|Skica|Skenario konsep|Skenario|Situācija|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello scenario|Scenārijs pēc parauga|Scenārijs|Scenár|Scenariusz|Scenariul de şablon|Scenariul de sablon|Scenariu|Scenarios|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenariji|Scenarijaus šablonas|Scenarijai|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Primer|Pozadí|Pozadina|Pozadie|Plan du scénario|Plan du Scénario|Piemēri|Pavyzdžiai|Paraugs|Osnova scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Kịch bản|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Juhtumid|Háttér|Grundlage|Geçmiş|Forgatókönyv vázlat|Forgatókönyv|Exemplos|Exemples|Exemplele|Exempel|Examples|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esempi|Escenario|Escenari|Enghreifftiau|Eksempler|Ejemplos|EXAMPLZ|Dữ liệu|Dis is what went down|Dasar|Contoh|Contexto|Contexte|Contesto|Condiţii|Conditii|Cobber|Cenário|Cenario|Cefndir|Bối cảnh|Blokes|Beispiele|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|All y'all|Achtergrond|Abstrakt Scenario|Abstract Scenario):(.*)</string> </dict> <key>scenario_outline_variable</key> <dict> <key>begin</key> <string>&lt;</string> <key>end</key> <string>&gt;</string> <key>name</key> <string>variable.other</string> </dict> <key>strings_double_quote</key> <dict> <key>begin</key> <string>"</string> <key>end</key> <string>"</string> <key>name</key> <string>string.quoted.double</string> <key>patterns</key> <array> <dict> <key>match</key> <string>\\.</string> <key>name</key> <string>constant.character.escape.untitled</string> </dict> </array> </dict> <key>strings_single_quote</key> <dict> <key>begin</key> <string>(?&lt;![a-zA-Z"])'</string> <key>end</key> <string>'(?![a-zA-Z])</string> <key>name</key> <string>string.quoted.single</string> <key>patterns</key> <array> <dict> <key>match</key> <string>\\.</string> <key>name</key> <string>constant.character.escape</string> </dict> </array> </dict> <key>strings_triple_quote</key> <dict> <key>begin</key> <string>"""</string> <key>end</key> <string>"""</string> <key>name</key> <string>string.quoted.single</string> </dict> <key>tags</key> <dict> <key>captures</key> <dict> <key>0</key> <dict> <key>name</key> <string>storage.type.tag.cucumber</string> </dict> </dict> <key>match</key> <string>(@[^@rnt ]+)</string> </dict> </dict> <key>scopeName</key> <string>text.gherkin.feature</string> <key>uuid</key> <string>85E2C52C-9B16-4A54-81E7-6D8D3ADAEFA8</string> </dict> </plist> view raw Cucumber Plain Text Feature.tmLanguage hosted with ❤ by GitHub Respecto de JBehave y Cucumber-JVM; te puedo decir, Nico, que me pareció que la implementación del primero en muchos casos es un tanto más rebuscada que con Cucumber-JVM. Por ejemplo, el soporte multilenguaje que tiene Cucumber es excelente. Muy fácil de manejar. Tanto, que como bien sabés alcanza con definir #language: al inicio de la feature y listo. En el caso de JBehave, no es tan sencillo. Hay que agregar determinada configuración en un archivo XML donde hay un montón de otras cosas. Si lo considerás de valor, te puedo dar uno o dos ejemplos más de cosas que me parecieron un tanto vuelteras para configurar. En Cucumber, como te decía me parece que todo es más fácil de implementar. Con muy poquito código (apenas una clase donde se configura el runner mediante una java annotation) y una mínima configuración a nivel proyecto java, tenés las specs corriendo. De cualquier forma, creo que lo que más me llevó a usar Cucumber es la comunidad de usuarios y contribuyentes que tiene detrás. Creo que en estos últimos años ha sido el framework BDD que más terreno ganó en el mercado. Entonces, cuando uno tiene un problema (que al menos a mí me pasa seguido =P ) tener múltiples alternativas para buscar referencias vale muchísimo.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.