Coder Social home page Coder Social logo

damianszczepanik / cucumber-reporting Goto Github PK

View Code? Open in Web Editor NEW
541.0 63.0 402.0 23.02 MB

HTML reports for Cucumber

License: GNU Lesser General Public License v2.1

Java 98.97% CSS 0.93% JavaScript 0.10%
java cucumber-reports json-report jenkins html-report

cucumber-reporting's People

Contributors

anoordover avatar dabogee avatar damianszczepanik avatar dependabot[bot] avatar ekalin avatar embee1981 avatar farjang avatar flokaemmerer avatar ghostcity avatar hazendaz avatar jan-molak avatar jeaninev avatar jfougere avatar jiayongfei avatar julianladisch avatar kingsleyh avatar lvogt avatar markkrijgsman avatar mathias21 avatar midopa avatar mpkorstanje avatar msymons avatar notmattlucas avatar oltruong avatar radek1st avatar rexhoffman avatar rfriend-aimia avatar shchukax avatar snyk-bot avatar tommywo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cucumber-reporting's Issues

One "pending" status in the JSON file make the generation fail

If there is a "status":"pending" in the JSON file, this make the parser crash with this following NPE (and the report generation fails) :
java.lang.NullPointerException
at net.masterthought.cucumber.json.Step$predicates$1.matches(Step.java:171)
at net.masterthought.cucumber.json.Step$predicates$1.matches(Step.java:168)
at com.googlecode.totallylazy.iterators.FilterIterator.getNext(FilterIterator.java:20)
at com.googlecode.totallylazy.iterators.StatefulIterator.hasNext(StatefulIterator.java:23)
at com.googlecode.totallylazy.Iterators.size(Iterators.java:347)
at com.googlecode.totallylazy.Sequences.size(Sequences.java:384)
at com.googlecode.totallylazy.Sequence.size(Sequence.java:245)
at net.masterthought.cucumber.json.Element.getStatus(Element.java:36)
at net.masterthought.cucumber.ReportInformation.processFeatures(ReportInformation.java:225)
at net.masterthought.cucumber.ReportInformation.(ReportInformation.java:41)
at net.masterthought.cucumber.ReportBuilder.(ReportBuilder.java:39)
at net.masterthought.cucumber.CucumberReportGeneratorMojo.execute(CucumberReportGeneratorMojo.java:61)
... 21 more

The expected behavior is to deal this "pending" status like the "undefined" one.
(If we replace manually all the "prending" status by "undefined" ones : the generation is OK)

Regards.

Problem with text encoding

I write features in German and I have problem with German letters like ö, ä, ü. In generated html report there are only ??, ??, ??. But in generated json everything is ok - I see normal letters.

html file is not always utf-8 file

private void generateReport(String fileName, Template featureResult, VelocityContext context) throws Exception {
        Writer writer = new FileWriter(new File(reportDirectory, fileName));
        featureResult.merge(context, writer);
        writer.flush();
        writer.close();
    }

FileWriter use system default encoding!

doc_string fields results in "Result was missing for this step"

My report is generating a lot of "Result was missing for this step". Appears to be from the doc_string field in my generated json report.

cucumber_1.json

[{
        "id" : "command-line-interface-for-pas",
        "description" : "",
        "name" : "Command Line Interface for PAS",
        "keyword" : "Feature",
        "line" : 1,
        "uri" : "features/command_line_interface.feature"
    }, {
        "id" : "adding-invalid-attribute-values",
        "description" : "",
        "name" : "Adding invalid attribute values",
        "keyword" : "Feature",
        "line" : 1,
        "elements" : [{
                "id" : "adding-invalid-attribute-values;adding-a-visitor-attribute-value-for-a-non-valid-attribute-should-return-http-400-and-attribute-shouldnt-be-stored",
                "description" : "",
                "name" : "Adding a visitor attribute value for a non-valid attribute should return HTTP 400 and attribute shouldnt be stored",
                "keyword" : "Scenario",
                "line" : 3,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has no attributes",
                        "keyword" : "Given ",
                        "line" : 4
                    }, {
                        "name" : "the attribute \"invalidAttribute\" has NOT been defined",
                        "keyword" : "And ",
                        "line" : 5
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_1234:",
                        "keyword" : "When ",
                        "line" : 6,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Id\": \"unknownShopperId_1234\",\n\t    \"Attributes\": [{\n\t        \"Name\": \"invalidAttribute\",\n\t        \"Value\": \"not\",\n\t        \"StartDate\": \"Yesterday\",\n\t        \"EndDate\": \"Tomorrow\"\n\t    }]\n\t}",
                            "line" : 7,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 18
                    }, {
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 19,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Attribute invalidAttribute is not defined.\"]\n\t}",
                            "line" : 20,
                            "content_type" : ""
                        }
                    }, {
                        "result" : {
                            "duration" : 42913261,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_1234 should have no attributes",
                        "keyword" : "And ",
                        "line" : 25,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_1234",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_id_unknownShopperId_has_no_attributes(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-invalid-attribute-values;adding-an-attribute-value-with-start-date-greater-than-end-date-should-return-http-400-and-attribute-shouldn\u0027t-be-stored.",
                "description" : "",
                "name" : "Adding an attribute value with start date greater than end date should return HTTP 400 and attribute shouldn\u0027t be stored.",
                "keyword" : "Scenario",
                "line" : 27,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 28
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 29
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 30,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Id\": \"unknownShopperId_594\",\n\t    \"Attributes\": [{\n\t        \"Name\": \"ondivp\",\n\t        \"Value\": \"B\",\n\t       \t\"StartDate\":\"Tomorrow\",\n\t\t\t\"EndDate\":\"Yesterday\"\n\t    }]\n\t}",
                            "line" : 31,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 42
                    }, {
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 43,
                        "doc_string" : {
                            "value" : "\t{\n\t\t\"Errors\":[\"End date should be after start date.\"]\n\t}",
                            "line" : 44,
                            "content_type" : ""
                        }
                    }, {
                        "result" : {
                            "duration" : 28017966,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have no attributes",
                        "keyword" : "And ",
                        "line" : 49,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_id_unknownShopperId_has_no_attributes(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-invalid-attribute-values;adding-an-attribute-value-with-invalid-start-or-end-dates-should-return-http-400-and-attribute-shouldn\u0027t-be-stored.",
                "description" : "",
                "name" : "Adding an attribute value with invalid start or end dates should return HTTP 400 and attribute shouldn\u0027t be stored.",
                "keyword" : "Scenario",
                "line" : 51,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 52
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 53
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 54,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Id\": \"unknownShopperId_594\",\n\t    \"Attributes\": [{\n\t        \"Name\": \"ondivp\",\n\t        \"Value\": \"C\",\n\t        \"StartDate\": \"12/35/2011 12:00\",\n\t        \"EndDate\": \"02/15/2012 18:00\"\n\t    }]\n\t}",
                            "line" : 55,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 66
                    }, {
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 67,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Invalid date value. 12/35/2011 12:00\"]\n\t}",
                            "line" : 68,
                            "content_type" : ""
                        }
                    }, {
                        "result" : {
                            "duration" : 28418633,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have no attributes",
                        "keyword" : "And ",
                        "line" : 73,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_id_unknownShopperId_has_no_attributes(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-invalid-attribute-values;attempting-to-add-attribute-values-with-name-missing-should-return-http-400-and-attribute-shouldn\u0027t-be-stored.",
                "description" : "",
                "name" : "Attempting to add attribute values with name missing should return HTTP 400 and attribute shouldn\u0027t be stored.",
                "keyword" : "Scenario",
                "line" : 75,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 76
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 77
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 78,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Attributes\": [{\n\t        \"Value\": \"C\",\n\t        \"StartDate\": \"12/15/2011 12:00\",\n\t        \"EndDate\": \"02/15/2012 18:00\"\n\t    }]\n\t}",
                            "line" : 79,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 88
                    }, {
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 89,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Attribute short name must be specified.\"]\n\t}",
                            "line" : 90,
                            "content_type" : ""
                        }
                    }, {
                        "result" : {
                            "duration" : 27286419,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have no attributes",
                        "keyword" : "And ",
                        "line" : 95,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_id_unknownShopperId_has_no_attributes(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-invalid-attribute-values;attempting-to-add-attribute-values-with-value-missing-should-return-http-400-and-attribute-shouldn\u0027t-be-stored.",
                "description" : "",
                "name" : "Attempting to add attribute values with value missing should return HTTP 400 and attribute shouldn\u0027t be stored.",
                "keyword" : "Scenario",
                "line" : 97,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 98
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 99
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 100,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Attributes\": [{\n\t        \"Name\": \"ondivp\",\n\t        \"StartDate\": \"12/15/2011 12:00\",\n\t        \"EndDate\": \"02/15/2012 18:00\"\n\t    }]\n\t}",
                            "line" : 101,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 110
                    }, {
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 111,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Attribute value must be specified.\"]\n\t}",
                            "line" : 112,
                            "content_type" : ""
                        }
                    }, {
                        "result" : {
                            "duration" : 29059864,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have no attributes",
                        "keyword" : "And ",
                        "line" : 117,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_id_unknownShopperId_has_no_attributes(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }
        ],
        "uri" : "features\\adding_invalid_attribute_values.feature"
    }, {
        "id" : "adding-valid-attribute-values",
        "description" : "",
        "name" : "Adding valid attribute values",
        "keyword" : "Feature",
        "line" : 1,
        "elements" : [{
                "id" : "adding-valid-attribute-values;adding-an-attribute-value-with-valid-start-and-end-dates-should-return-http-204-and-store-the-attribute-value.",
                "description" : "",
                "name" : "Adding an attribute value with valid start and end dates should return HTTP 204 and store the attribute value.",
                "keyword" : "Scenario",
                "line" : 3,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 4
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 5
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 6,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Id\": \"unknownShopperId_594\",\r\n\t    \"Attributes\": [{\r\n\t        \"Name\": \"ondivp\",\r\n\t        \"Value\": \"B\",\r\n\t        \"StartDate\": \"Yesterday\",\r\n\t        \"EndDate\": \"Tomorrow\"\r\n\t    }]\r\n\t}",
                            "line" : 7,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 18
                    }, {
                        "result" : {
                            "duration" : 6666018,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have attributes",
                        "keyword" : "And ",
                        "line" : 19,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_Id_unknown_should_have_attributes(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 20
                            }, {
                                "cells" : ["ondivp", "B", "Yesterday", "Tomorrow"],
                                "line" : 21
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-valid-attribute-values;adding-an-attribute-value-without-dates-should-store-it-with-attribute-definitions-dates-and-return-http-204.",
                "description" : "",
                "name" : "Adding an attribute value without dates should store it with attribute definitions dates and return HTTP 204.",
                "keyword" : "Scenario",
                "line" : 23,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_594 has no attributes",
                        "keyword" : "Given ",
                        "line" : 24
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined as",
                        "keyword" : "And ",
                        "line" : 25,
                        "rows" : [{
                                "cells" : ["Description", "Name", "Short Name", "Secure", "StartDate", "EndDate", "Active"],
                                "line" : 26
                            }, {
                                "cells" : ["Attribute Description", "Attribute Name", "ondivp", "false", "12/15/2012 06:00", "01/01/2014 18:00", "true"],
                                "line" : 27
                            }
                        ]
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_594:",
                        "keyword" : "When ",
                        "line" : 28,
                        "doc_string" : {
                            "value" : "{\t\"Id\": \"unknownShopperId_594\",\r\n\t\"Attributes\":\r\n\t[{\"Name\":\"ondivp\",\r\n\t\"Value\":\"B\",\r\n\t\"StartDate\":\"\",\r\n\t\"EndDate\":\"\"}]}",
                            "line" : 29,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 37
                    }, {
                        "result" : {
                            "duration" : 3665530,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_594 should have attributes",
                        "keyword" : "And ",
                        "line" : 38,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_594",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_Id_unknown_should_have_attributes(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 39
                            }, {
                                "cells" : ["ondivp", "B", "12/15/2012 06:00", "01/01/2014 18:00"],
                                "line" : 40
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-valid-attribute-values;fully-qualified-visitor-id-has-not-specific-format-yet",
                "description" : "",
                "name" : "Fully qualified visitor id has not specific format yet",
                "keyword" : "Scenario",
                "line" : 44,
                "steps" : [{
                        "name" : "visitor with Id aVisitorId has no attributes",
                        "keyword" : "Given ",
                        "line" : 45
                    }, {
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 46
                    }, {
                        "name" : "I PUT to /visitor/aVisitorId:",
                        "keyword" : "When ",
                        "line" : 47,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Attributes\": [{\r\n\t        \"Name\": \"ondivp\",\r\n\t        \"Value\": \"B\",\r\n\t        \"StartDate\": \"Yesterday\",\r\n\t        \"EndDate\": \"Tomorrow\"\r\n\t    }]\r\n\t}",
                            "line" : 48,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 58
                    }, {
                        "result" : {
                            "duration" : 3238179,
                            "status" : "passed"
                        },
                        "name" : "visitor with id aVisitorId should have attributes",
                        "keyword" : "And ",
                        "line" : 59,
                        "match" : {
                            "arguments" : [{
                                    "val" : "aVisitorId",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_Id_unknown_should_have_attributes(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 60
                            }, {
                                "cells" : ["ondivp", "B", "Yesterday", "Tomorrow"],
                                "line" : 61
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "adding-valid-attribute-values;updating-attribute-values-for-a-specific-user",
                "description" : "",
                "name" : "Updating attribute values for a specific user",
                "keyword" : "Scenario",
                "line" : 63,
                "steps" : [{
                        "name" : "the attribute \"ondivp\" has been defined",
                        "keyword" : "Given ",
                        "line" : 64
                    }, {
                        "name" : "the attribute \"onjpdivp\" has been defined",
                        "keyword" : "And ",
                        "line" : 65
                    }, {
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "And ",
                        "line" : 66,
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 67
                            }, {
                                "cells" : ["ondivp", "C", "Yesterday", "Tomorrow"],
                                "line" : 68
                            }, {
                                "cells" : ["onjpdivp", "D", "Yesterday", "Tomorrow"],
                                "line" : 69
                            }
                        ]
                    }, {
                        "name" : "I PUT to /visitor/unknownShopperId_1234:",
                        "keyword" : "When ",
                        "line" : 70,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Id\": \"unknownShopperId_1234\",\r\n\t    \"Attributes\": [{\r\n\t        \"Name\": \"ondivp\",\r\n\t        \"Value\": \"A\",\r\n\t        \"StartDate\": \"12/15/2012 06:00\",\r\n\t        \"EndDate\": \"01/01/2014 18:00\"\r\n\t    }]\r\n\t}",
                            "line" : 71,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 82
                    }, {
                        "result" : {
                            "duration" : 7344197,
                            "status" : "passed"
                        },
                        "name" : "visitor with id unknownShopperId_1234 should have attributes",
                        "keyword" : "And ",
                        "line" : 83,
                        "match" : {
                            "arguments" : [{
                                    "val" : "unknownShopperId_1234",
                                    "offset" : 16
                                }
                            ],
                            "location" : "AttributeValueSteps.visitor_with_Id_unknown_should_have_attributes(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 84
                            }, {
                                "cells" : ["ondivp", "A", "12/15/2012 06:00", "01/01/2014 18:00"],
                                "line" : 85
                            }, {
                                "cells" : ["onjpdivp", "D", "Yesterday", "Tomorrow"],
                                "line" : 86
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }
        ],
        "uri" : "features\\adding_valid_attribute_values.feature"
    }, {
        "id" : "defining-invalid-attributes",
        "description" : "",
        "name" : "Defining invalid attributes",
        "keyword" : "Feature",
        "line" : 1,
        "elements" : [{
                "id" : "defining-invalid-attributes;defining-an-attribute-with-start-date-after-end-date-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining an attribute with start date after end date should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 3,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 4,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"description is described\",\n\t    \"Name\": \"name is named\",\n\t    \"IsSecure\": false,\n\t    \"StartDate\": \"12/15/2014 06:00\",\n\t    \"EndDate\": \"01/01/2012 18:00\",\n\t    \"IsActive\": true\n\t}",
                            "line" : 5,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 15
                    }, {
                        "result" : {
                            "duration" : 256574,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 16,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"End date must be after start date.\"]\n\t}",
                            "line" : 17,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-invalid-attributes;defining-an-attribute-with-invalid-start-or-end-date-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining an attribute with invalid start or end date should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 22,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 23,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"description is described\",\n\t    \"Name\": \"name is named\",\n\t    \"IsSecure\": false,\n\t    \"StartDate\": \"12/35/2011 06:00\",\n\t    \"EndDate\": \"01/01/2012 18:00\",\n\t    \"IsActive\": true\n\t}",
                            "line" : 24,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 34
                    }, {
                        "result" : {
                            "duration" : 234818,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 35,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Invalid date value. 12/35/2011 06:00\"]\n\t}",
                            "line" : 36,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-invalid-attributes;defining-an-attribute-with-blank-description-field-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining an attribute with blank description field should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 42,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 43,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"\",\n\t    \"Name\": \"name is named\",\n\t    \"IsSecure\": false,\n\t    \"StartDate\": \"12/15/2012 06:00\",\n\t    \"EndDate\": \"01/01/2014 18:00\",\n\t    \"IsActive\": true\n\t}",
                            "line" : 44,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 54
                    }, {
                        "result" : {
                            "duration" : 482360,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 55,
                        "doc_string" : {
                            "value" : "\t{\n\t\t\"Errors\":[\"Attribute description must be specified.\"]\n\t}",
                            "line" : 56,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-invalid-attributes;defining-an-attribute-with-blank-name-field-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining an attribute with blank name field should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 63,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 64,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"Description is described\",\n\t    \"Name\": \"\",\n\t    \"IsSecure\": false,\n\t    \"StartDate\": \"12/15/2012 06:00\",\n\t    \"EndDate\": \"01/01/2014 18:00\",\n\t    \"IsActive\": true\n\t}",
                            "line" : 65,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 75
                    }, {
                        "result" : {
                            "duration" : 240564,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 76,
                        "doc_string" : {
                            "value" : "\t{\n\t\t\"Errors\":[\"Attribute name must be specified.\"]\n\t}",
                            "line" : 77,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-invalid-attributes;defining-attribute-without-issecure-flag-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining attribute without isSecure flag should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 84,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 85,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"This is the Old Navy division preference attribute generated by big data used by Ecom with values A, B, C \",\n\t    \"Name\": \"Old Navy Division Preference\",\n\t    \"StartDate\": \"11/02/2013 06:30\",\n\t    \"EndDate\": \"11/05/2013 06:30\",\n\t    \"IsActive\": true\n\t}",
                            "line" : 86,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 95
                    }, {
                        "result" : {
                            "duration" : 508634,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 96,
                        "doc_string" : {
                            "value" : "\t{\n\t\t\"Errors\":[\"Attribute secure flag must be specified.\"]\n\t}",
                            "line" : 97,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-invalid-attributes;defining-attribute-without-isactive-flag-should-return-400-with-proper-error-message",
                "description" : "",
                "name" : "Defining attribute without isActive flag should return 400 with proper error message",
                "keyword" : "Scenario",
                "line" : 104,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 105,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Desc\": \"This is the Old Navy division preference attribute generated by big data used by Ecom with values A, B, C \",\n\t    \"Name\": \"Old Navy Division Preference\",\n\t    \"StartDate\": \"11/03/2013 06:30\",\n\t    \"EndDate\": \"11/06/2013 06:30\",\n\t    \"IsSecure\": false\n\t}",
                            "line" : 106,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 400",
                        "keyword" : "Then ",
                        "line" : 115
                    }, {
                        "result" : {
                            "duration" : 267659,
                            "status" : "passed"
                        },
                        "name" : "I expect the following error response:",
                        "keyword" : "And ",
                        "line" : 116,
                        "doc_string" : {
                            "value" : "\t{\n\t    \"Errors\": [\"Attribute active flag must be specified.\"]\n\t}",
                            "line" : 117,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "HttpSteps.I_expect_the_following_error_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }
        ],
        "uri" : "features\\defining_invalid_attributes.feature"
    }, {
        "id" : "defining-valid-attributes",
        "description" : "",
        "name" : "Defining valid attributes",
        "keyword" : "Feature",
        "line" : 1,
        "elements" : [{
                "id" : "defining-valid-attributes;defining-a-new-attribute-with-all-fields",
                "description" : "",
                "name" : "Defining a new attribute with all fields",
                "keyword" : "Scenario",
                "line" : 3,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 4,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Desc\": \"इ लव ब�लूबेरी डेनिश\",\r\n\t    \"Name\": \"ールド�イビー課�\",\r\n\t    \"IsSecure\": false,\r\n\t    \"StartDate\": \"12/15/2012 06:00\",\r\n\t    \"EndDate\": \"01/01/2014 18:00\",\r\n\t    \"IsActive\": true\r\n\t}",
                            "line" : 5,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 15
                    }, {
                        "result" : {
                            "duration" : 4081387,
                            "status" : "passed"
                        },
                        "name" : "attribute \"ondivp\" should be defined with the following properties:",
                        "keyword" : "And ",
                        "line" : 16,
                        "match" : {
                            "arguments" : [{
                                    "val" : "ondivp",
                                    "offset" : 11
                                }
                            ],
                            "location" : "AttributeDefinitionSteps.attribute_should_be_defined_with_the_following_properties(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Description", "Name", "Short Name", "Secure", "StartDate", "EndDate", "Active"],
                                "line" : 17
                            }, {
                                "cells" : ["इ लव ब�लूबेरी डेनिश", "ールド�イビー課�", "ondivp", "false", "12/15/2012 06:00", "01/01/2014 18:00", "true"],
                                "line" : 18
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-valid-attributes;defining-a-new-attribute-without-start-and-end-date-should-use-default-dates",
                "description" : "",
                "name" : "Defining a new attribute without start and end date should use default dates",
                "keyword" : "Scenario",
                "line" : 20,
                "steps" : [{
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 21,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Desc\": \"I love blueberry danish\",\r\n\t    \"Name\": \"old navy div pref\",\r\n\t    \"IsSecure\": false,\r\n\t    \"IsActive\": true\r\n\t}",
                            "line" : 22,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 30
                    }, {
                        "result" : {
                            "duration" : 3864632,
                            "status" : "passed"
                        },
                        "name" : "attribute \"ondivp\" should be defined with the following properties:",
                        "keyword" : "And ",
                        "line" : 31,
                        "match" : {
                            "arguments" : [{
                                    "val" : "ondivp",
                                    "offset" : 11
                                }
                            ],
                            "location" : "AttributeDefinitionSteps.attribute_should_be_defined_with_the_following_properties(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Description", "Name", "Short name", "Secure", "StartDate", "EndDate", "Active"],
                                "line" : 32
                            }, {
                                "cells" : ["I love blueberry danish", "old navy div pref", "ondivp", "false", "Today", "01/01/2200 00:00", "true"],
                                "line" : 33
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "defining-valid-attributes;putting-into-an-existing-attribute-should-override-all-fields",
                "description" : "",
                "name" : "Putting into an existing attribute should override all fields",
                "keyword" : "Scenario",
                "line" : 36,
                "steps" : [{
                        "name" : "the attribute \"ondivp\" has been defined as",
                        "keyword" : "Given ",
                        "line" : 37,
                        "rows" : [{
                                "cells" : ["Description", "Name", "Short name", "Secure", "StartDate", "EndDate", "Active"],
                                "line" : 38
                            }, {
                                "cells" : ["I love blueberry danish", "old navy div pref", "ondivp", "true", "Today", "01/01/2200 00:00", "false"],
                                "line" : 39
                            }
                        ]
                    }, {
                        "name" : "I PUT to /attribute/ondivp:",
                        "keyword" : "When ",
                        "line" : 40,
                        "doc_string" : {
                            "value" : "\t{\r\n\t    \"Desc\": \"I hate blueberry danish\",\r\n\t    \"Name\": \"sad old navy div pref\",\r\n\t    \"StartDate\": \"11/03/2014 06:30\",\r\n\t    \"EndDate\": \"11/06/2015 06:30\",\r\n\t    \"IsSecure\": false,\r\n\t    \"IsActive\": true\r\n\t}",
                            "line" : 41,
                            "content_type" : ""
                        }
                    }, {
                        "name" : "I expect to get an HTTP response code of 204",
                        "keyword" : "Then ",
                        "line" : 51
                    }, {
                        "result" : {
                            "duration" : 4216037,
                            "status" : "passed"
                        },
                        "name" : "attribute \"ondivp\" should be defined with the following properties:",
                        "keyword" : "And ",
                        "line" : 52,
                        "match" : {
                            "arguments" : [{
                                    "val" : "ondivp",
                                    "offset" : 11
                                }
                            ],
                            "location" : "AttributeDefinitionSteps.attribute_should_be_defined_with_the_following_properties(String,DataTable)"
                        },
                        "rows" : [{
                                "cells" : ["Description", "Name", "Short name", "Secure", "StartDate", "EndDate", "Active"],
                                "line" : 53
                            }, {
                                "cells" : ["I hate blueberry danish", "sad old navy div pref", "ondivp", "false", "11/03/2014 06:30", "11/06/2015 06:30", "true"],
                                "line" : 54
                            }
                        ]
                    }
                ],
                "type" : "scenario"
            }
        ],
        "uri" : "features\\defining_valid_attributes.feature"
    }, {
        "id" : "retrieving-attribute-values",
        "description" : "",
        "name" : "Retrieving attribute values",
        "keyword" : "Feature",
        "line" : 1,
        "elements" : [{
                "id" : "retrieving-attribute-values;retrieving-visitor-attribute-values-for-multiple-ids",
                "description" : "",
                "name" : "Retrieving visitor attribute values for multiple IDs",
                "keyword" : "Scenario",
                "line" : 3,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "Given ",
                        "line" : 4,
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 5
                            }, {
                                "cells" : ["ondivp", "C", "Yesterday", "Tomorrow"],
                                "line" : 6
                            }, {
                                "cells" : ["onjpdivp", "D", "Yesterday", "Tomorrow"],
                                "line" : 7
                            }
                        ]
                    }, {
                        "name" : "visitor with Id cust_3456 has attributes:",
                        "keyword" : "And ",
                        "line" : 8,
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 9
                            }, {
                                "cells" : ["onjpdivp", "F", "Yesterday", "Tomorrow"],
                                "line" : 10
                            }
                        ]
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_1234,cust_3456",
                        "keyword" : "When ",
                        "line" : 11
                    }, {
                        "result" : {
                            "duration" : 5787916,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 12,
                        "doc_string" : {
                            "value" : "    [{\n        \"Id\": \"unknownShopperId_1234\",\n        \"Attributes\": [{\n            \"Name\": \"ondivp\",\n            \"Value\": \"C\",\n            \"StartDate\": \"Yesterday\",\n            \"EndDate\": \"Tomorrow\"\n        }, {\n            \"Name\": \"onjpdivp\",\n            \"Value\": \"D\",\n            \"StartDate\": \"Yesterday\",\n            \"EndDate\": \"Tomorrow\"\n        }]\n    }, {\n        \"Id\": \"cust_3456\",\n        \"Attributes\": [{\n            \"Name\": \"onjpdivp\",\n            \"Value\": \"F\",\n            \"StartDate\": \"Yesterday\",\n            \"EndDate\": \"Tomorrow\"\n        }]\n    }]       ",
                            "line" : 13,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "retrieving-attribute-values;retrieving-visitor-attribute-values-for-specified-attribute-short-names",
                "description" : "",
                "name" : "Retrieving visitor attribute values for specified attribute short names",
                "keyword" : "Scenario",
                "line" : 38,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "Given ",
                        "line" : 39,
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 40
                            }, {
                                "cells" : ["ondivp", "C", "Yesterday", "Tomorrow"],
                                "line" : 41
                            }, {
                                "cells" : ["onjpdivp", "D", "Yesterday", "Tomorrow"],
                                "line" : 42
                            }, {
                                "cells" : ["brdivp", "E", "Yesterday", "Tomorrow"],
                                "line" : 43
                            }
                        ]
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_1234?attr\u003dondivp,brdivp,brjpdivp",
                        "keyword" : "When ",
                        "line" : 44
                    }, {
                        "result" : {
                            "duration" : 1759077,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 45,
                        "doc_string" : {
                            "value" : "[{\n\"Id\": \"unknownShopperId_1234\",\n\"Attributes\": [{\n    \"Name\": \"ondivp\",\n    \"Value\": \"C\",\n    \"StartDate\": \"Yesterday\",\n    \"EndDate\": \"Tomorrow\"\n}, {\n    \"Name\": \"brdivp\",\n    \"Value\": \"E\",\n    \"StartDate\": \"Yesterday\",\n    \"EndDate\": \"Tomorrow\"\n}]\n}]         ",
                            "line" : 46,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "retrieving-attribute-values;retrieving-active-and-unexpired-visitor-attribute-values-with-preview-date",
                "description" : "",
                "name" : "Retrieving active and unexpired visitor attribute values with preview date",
                "keyword" : "Scenario",
                "line" : 63,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "Given ",
                        "line" : 64,
                        "rows" : [{
                                "cells" : ["Name", "Value", "Active", "StartDate", "EndDate"],
                                "line" : 65
                            }, {
                                "cells" : ["still", "C", "true", "Yesterday", "Yesterday"],
                                "line" : 66
                            }, {
                                "cells" : ["a-", "C", "true", "Yesterday", "Today"],
                                "line" : 67
                            }, {
                                "cells" : ["live", "C", "false", "Yesterday", "Tomorrow"],
                                "line" : 68
                            }, {
                                "cells" : ["extinct", "E", "true", "Today", "Today"],
                                "line" : 69
                            }, {
                                "cells" : ["dormant", "E", "true", "Today", "Tomorrow"],
                                "line" : 70
                            }, {
                                "cells" : ["hidden", "E", "true", "Tomorrow", "Tomorrow"],
                                "line" : 71
                            }
                        ]
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_1234?previewDate\u003dYesterday",
                        "keyword" : "When ",
                        "line" : 72
                    }, {
                        "result" : {
                            "duration" : 1484849,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 73,
                        "doc_string" : {
                            "value" : "       [{\n\t    \"Id\": \"unknownShopperId_1234\",\n\t    \"Attributes\": [{\n\t        \"Name\": \"still\",\n\t        \"Value\": \"C\",\n\t        \"StartDate\": \"Yesterday\",\n\t        \"EndDate\": \"Yesterday\"\n\t    }, {\n\t        \"Name\": \"a-\",\n\t        \"Value\": \"C\",\n\t        \"StartDate\": \"Yesterday\",\n\t        \"EndDate\": \"Today\"\n\t    }]\n\t}]",
                            "line" : 74,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "retrieving-attribute-values;retrieving-active-and-unexpired-visitor-attribute-values-without-specifying-preview-date",
                "description" : "",
                "name" : "Retrieving active and unexpired visitor attribute values without specifying preview date",
                "keyword" : "Scenario",
                "line" : 91,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "Given ",
                        "line" : 92,
                        "rows" : [{
                                "cells" : ["Name", "Value", "Active", "StartDate", "EndDate"],
                                "line" : 93
                            }, {
                                "cells" : ["still", "C", "true", "Yesterday", "Today"],
                                "line" : 94
                            }, {
                                "cells" : ["a-", "C", "true", "Today", "Tomorrow"],
                                "line" : 95
                            }, {
                                "cells" : ["live", "C", "true", "Today", "Today"],
                                "line" : 96
                            }, {
                                "cells" : ["extinct", "E", "true", "Yesterday", "Yesterday"],
                                "line" : 97
                            }, {
                                "cells" : ["dormant", "E", "true", "Tomorrow", "Tomorrow"],
                                "line" : 98
                            }, {
                                "cells" : ["hidden", "E", "false", "Yesterday", "Tomorrow"],
                                "line" : 99
                            }
                        ]
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_1234",
                        "keyword" : "When ",
                        "line" : 100
                    }, {
                        "result" : {
                            "duration" : 1395356,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 101,
                        "doc_string" : {
                            "value" : "      [{\n    \"Id\": \"unknownShopperId_1234\",\n    \"Attributes\": [{\n        \"Name\": \"still\",\n        \"Value\": \"C\",\n        \"StartDate\": \"Yesterday\",\n        \"EndDate\": \"Today\"\n    }, {\n        \"Name\": \"a-\",\n        \"Value\": \"C\",\n        \"StartDate\": \"Today\",\n        \"EndDate\": \"Tomorrow\"\n    }, {\n        \"Name\": \"live\",\n        \"Value\": \"C\",\n        \"StartDate\": \"Today\",\n        \"EndDate\": \"Today\"\n    }]\n}]",
                            "line" : 102,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "retrieving-attribute-values;retrieving-visitor-attribute-values",
                "description" : "",
                "name" : "Retrieving visitor attribute values",
                "keyword" : "Scenario",
                "line" : 124,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_1234 has attributes:",
                        "keyword" : "Given ",
                        "line" : 125,
                        "rows" : [{
                                "cells" : ["Name", "Value", "StartDate", "EndDate"],
                                "line" : 126
                            }, {
                                "cells" : ["ondivp", "C", "Yesterday", "Tomorrow"],
                                "line" : 127
                            }, {
                                "cells" : ["onjpdivp", "D", "Yesterday", "Tomorrow"],
                                "line" : 128
                            }
                        ]
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_1234",
                        "keyword" : "When ",
                        "line" : 129
                    }, {
                        "result" : {
                            "duration" : 1086646,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 130,
                        "doc_string" : {
                            "value" : "    [{\n \"Id\": \"unknownShopperId_1234\",\n \"Attributes\": [{\n     \"Name\": \"ondivp\",\n     \"Value\": \"C\",\n     \"StartDate\": \"Yesterday\",\n     \"EndDate\": \"Tomorrow\"\n }, {\n     \"Name\": \"onjpdivp\",\n     \"Value\": \"D\",\n     \"StartDate\": \"Yesterday\",\n     \"EndDate\": \"Tomorrow\"\n }]\n}]",
                            "line" : 131,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }, {
                "id" : "retrieving-attribute-values;retrieving-a-visitor-attribute-value-for-visitor-with-no-attribute",
                "description" : "",
                "name" : "Retrieving a visitor attribute value for visitor with no attribute",
                "keyword" : "Scenario",
                "line" : 148,
                "steps" : [{
                        "name" : "visitor with Id unknownShopperId_9999 has no attributes",
                        "keyword" : "Given ",
                        "line" : 149
                    }, {
                        "name" : "I request GET /visitor/unknownShopperId_9999",
                        "keyword" : "When ",
                        "line" : 150
                    }, {
                        "result" : {
                            "duration" : 411341,
                            "status" : "passed"
                        },
                        "name" : "I expect the following visitor attribute response:",
                        "keyword" : "Then ",
                        "line" : 151,
                        "doc_string" : {
                            "value" : "  [{\n\"Id\": \"unknownShopperId_9999\"\n}]",
                            "line" : 152,
                            "content_type" : ""
                        },
                        "match" : {
                            "location" : "AttributeValueSteps.I_expect_the_following_json_response(String)"
                        }
                    }
                ],
                "type" : "scenario"
            }
        ],
        "uri" : "features\\retrieve_attribute_values.feature"
    }
]

Tag View Graph: Use Vertical rather than Horizontal

Issue #26 covers problems with tag counts. Whilst waiting for a fix, I essentially stopped using tags... but have every intention of going back and adding a LOT of additional tags to my feature files as soon as the fix is in.

However, I fear that doing this will make the Tag View graph look a bit squashed. This is what my graph looks like as things stand:

tag-chart

(Everything was green last week... honest!)

The tags on the horizontal access are almost unreadable... it'll be worse when there are 80 or 120 instead of just 40.

So, would it be possible to switch the graph from a horizontal to a vertical orientation?

  1. The bars would be longer (and easier to work with) as they would now be horizontal, using the width of the graph.

  2. The tag names would now be on the Y axis and easier to read. Furthermore, it would not matter if there were 3 or 30 or 300... the graph should still be readable (although maybe harder to print for too many tags?).

Note: I have read the comment on issue #13...

I have been working on removing all html from the code to allow
for proper templating...

...let people easily customise the reports with the information that is important to > them and add graphs and charts as they like

I just wanted to add an idea into the pot!

NPE generating report

I'm trying to generate an HTML report from a JSON generated by cucumber-jvm. I'm using cucumber-core 1.1.2 because of this issue cucumber/cucumber-jvm#565 I will try using 1.1.4-SNAPSHOT next

I get a page that has only a pink bar saying "null pointer exception." When I paste my JSON (2.8mb worth) into the error checker from the troubleshooting page I get the following:

Cucumber-Reporting Report diagnostic
Error Detected
["java.io.FileOutputStream.open(Native Method)", "java.io.FileOutputStream.(FileOutputStream.java:209)", "java.io.FileOutputStream.(FileOutputStream.java:160)", "java.io.FileWriter.(FileWriter.java:90)", "net.masterthought.cucumber.ReportBuilder.generateReport(ReportBuilder.java:250)", "net.masterthought.cucumber.ReportBuilder.generateErrorPage(ReportBuilder.java:224)", "net.masterthought.cucumber.ReportBuilder.(ReportBuilder.java:58)", "sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown Source)", "sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)", "java.lang.reflect.Constructor.newInstance(Constructor.java:532)", "org.jruby.javasupport.JavaConstructor.newInstanceDirect(JavaConstructor.java:243)", "org.jruby.java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:68)", "org.jruby.java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:143)", "org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:286)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:81)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:85)", "org.jruby.java.proxies.ConcreteJavaProxy$2.call(ConcreteJavaProxy.java:44)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:79)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:85)", "org.jruby.RubyClass.newInstance(RubyClass.java:876)", "org.jruby.RubyClass$INVOKER$i$newInstance.call(RubyClass$INVOKER$i$newInstance.gen)", "org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:179)", "org.jruby.java.proxies.ConcreteJavaProxy$3.call(ConcreteJavaProxy.java:134)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:70)", "rubyjit.CucumberReporting$$initialize_203AA27F2E5F44FFAF037006A8B557BF973DEC87.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/src/cucumber_reporting.rb:13)", "rubyjit.CucumberReporting$$initialize_203AA27F2E5F44FFAF037006A8B557BF973DEC87.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/src/cucumber_reporting.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:101)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:79)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:85)", "org.jruby.RubyClass.newInstance(RubyClass.java:876)", "org.jruby.RubyClass$INVOKER$i$newInstance.call(RubyClass$INVOKER$i$newInstance.gen)", "org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:179)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:70)", "org.jruby.ast.CallManyArgsNode.interpret(CallManyArgsNode.java:59)", "org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)", "org.jruby.ast.BlockNode.interpret(BlockNode.java:71)", "org.jruby.ast.RescueNode.executeBody(RescueNode.java:224)", "org.jruby.ast.RescueNode.interpret(RescueNode.java:119)", "org.jruby.ast.BeginNode.interpret(BeginNode.java:83)", "org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)", "org.jruby.evaluator.ASTInterpreter.INTERPRET_BLOCK(ASTInterpreter.java:112)", "org.jruby.runtime.Interpreted19Block.evalBlockBody(Interpreted19Block.java:209)", "org.jruby.runtime.Interpreted19Block.yield(Interpreted19Block.java:197)", "org.jruby.runtime.Interpreted19Block.call(Interpreted19Block.java:128)", "org.jruby.runtime.Block.call(Block.java:89)", "org.jruby.RubyProc.call(RubyProc.java:261)", "org.jruby.internal.runtime.methods.ProcMethod.call(ProcMethod.java:64)", "org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:201)", "org.jruby.RubyMethod.call(RubyMethod.java:118)", "org.jruby.RubyMethod$INVOKER$i$call.call(RubyMethod$INVOKER$i$call.gen)", "org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrNBlock.call(JavaMethod.java:261)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:134)", "org.jruby.ast.CallNoArgNode.interpret(CallNoArgNode.java:64)", "org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)", "org.jruby.evaluator.ASTInterpreter.INTERPRET_BLOCK(ASTInterpreter.java:112)", "org.jruby.runtime.Interpreted19Block.evalBlockBody(Interpreted19Block.java:209)", "org.jruby.runtime.Interpreted19Block.yield(Interpreted19Block.java:197)", "org.jruby.runtime.Interpreted19Block.call(Interpreted19Block.java:128)", "org.jruby.runtime.Block.call(Block.java:89)", "org.jruby.RubyProc.call(RubyProc.java:261)", "org.jruby.RubyProc.call19(RubyProc.java:249)", "org.jruby.RubyProc$INVOKER$i$0$0$call19.call(RubyProc$INVOKER$i$0$0$call19.gen)", "org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:217)", "org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:213)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:202)", "org.jruby.runtime.callsite.CachingCallSite.callVarargs(CachingCallSite.java:104)", "rubyjit.Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968.block_2$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:785)", "rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_2$RUBY$file.call(rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_2$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:121)", "org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:96)", "org.jruby.runtime.Block.yieldSpecific(Block.java:99)", "rubyjit.Sinatra::Base$$route_eval_8C613D4A743043A48623BF352882D27A2220E27B.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:801)", "rubyjit.Sinatra::Base$$route_eval_8C613D4A743043A48623BF352882D27A2220E27B.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:161)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)", "rubyjit.Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968.block_1$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:785)", "rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_1$RUBY$file.call(rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_1$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:121)", "org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:106)", "org.jruby.runtime.Block.yieldSpecific(Block.java:117)", "rubyjit.Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073.block_2$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:822)", "rubyjit$Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073$block_2$RUBY$file.call(rubyjit$Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073$block_2$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:139)", "org.jruby.runtime.Block.yield(Block.java:130)", "org.jruby.RubyContinuation.enter(RubyContinuation.java:107)", "org.jruby.RubyKernel.rbCatch19Common(RubyKernel.java:1181)", "org.jruby.RubyKernel.rbCatch19(RubyKernel.java:1174)", "org.jruby.RubyKernel$INVOKER$s$rbCatch19.call(RubyKernel$INVOKER$s$rbCatch19.gen)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:177)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:188)", "rubyjit.Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073.chained_0_ensure_1$RUBY$ensure(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:820)", "rubyjit.Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "rubyjit.Sinatra::Base$$process_route_A431099D4515854914AD2CBB3A8EBCA9EF435073.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.ast.executable.AbstractScript.file(AbstractScript.java:50)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:281)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:245)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:256)", "rubyjit.Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968.block_0$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:784)", "rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_0$RUBY$file.call(rubyjit$Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968$block_0$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:139)", "org.jruby.runtime.Block.yield(Block.java:130)", "org.jruby.RubyArray.eachCommon(RubyArray.java:1606)", "org.jruby.RubyArray.each(RubyArray.java:1613)", "org.jruby.RubyArray$INVOKER$i$0$0$each.call(RubyArray$INVOKER$i$0$0$each.gen)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)", "rubyjit.Sinatra::Base$$route!_AD49F929CD09ECE08A2F7D8ECF4E4E740528F968.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:783)", "rubyjit.Sinatra::Base$$route!AD49F929CD09ECE08A2F7D8ECF4E4E740528F968.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.ast.executable.AbstractScript.file(AbstractScript.java:38)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:141)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:134)", "rubyjit.Sinatra::Base$$dispatch!32CEF8F441C55720F2AC7409196CBFC4F97B89CF.chained_1_rescue_1$RUBY$SYNTHETIC__file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:886)", "rubyjit.Sinatra::Base$$dispatch!_32CEF8F441C55720F2AC7409196CBFC4F97B89CF.chained_0_ensure_1$RUBY$ensure(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "rubyjit.Sinatra::Base$$dispatch!_32CEF8F441C55720F2AC7409196CBFC4F97B89CF.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "rubyjit.Sinatra::Base$$dispatch!_32CEF8F441C55720F2AC7409196CBFC4F97B89CF.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:141)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:134)", "rubyjit.Sinatra::Base$$call!_F1A0960F02EBF281DFB1AE3733E87720D5C76009.block_0$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:719)", "rubyjit$Sinatra::Base$$call!_F1A0960F02EBF281DFB1AE3733E87720D5C76009$block_0$RUBY$file.call(rubyjit$Sinatra::Base$$call!_F1A0960F02EBF281DFB1AE3733E87720D5C76009$block_0$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:121)", "org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:96)", "org.jruby.runtime.Block.yieldSpecific(Block.java:99)", "rubyjit.Sinatra::Base$$invoke_1EEEE497B12EDF486DEE8D12842B4E8AED2BB2FB.block_0$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:871)", "rubyjit$Sinatra::Base$$invoke_1EEEE497B12EDF486DEE8D12842B4E8AED2BB2FB$block_0$RUBY$file.call(rubyjit$Sinatra::Base$$invoke_1EEEE497B12EDF486DEE8D12842B4E8AED2BB2FB$block_0$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:139)", "org.jruby.runtime.Block.yield(Block.java:130)", "org.jruby.RubyContinuation.enter(RubyContinuation.java:107)", "org.jruby.RubyKernel.rbCatch19Common(RubyKernel.java:1181)", "org.jruby.RubyKernel.rbCatch19(RubyKernel.java:1174)", "org.jruby.RubyKernel$INVOKER$s$rbCatch19.call(RubyKernel$INVOKER$s$rbCatch19.gen)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:177)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:188)", "rubyjit.Sinatra::Base$$invoke_1EEEE497B12EDF486DEE8D12842B4E8AED2BB2FB.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:871)", "rubyjit.Sinatra::Base$$invoke_1EEEE497B12EDF486DEE8D12842B4E8AED2BB2FB.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:161)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)", "rubyjit.Sinatra::Base$$call!_F1A0960F02EBF281DFB1AE3733E87720D5C76009.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:719)", "rubyjit.Sinatra::Base$$call!_F1A0960F02EBF281DFB1AE3733E87720D5C76009.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Sinatra::Base$$call_E7297D83DF1A6A3B6C6430CFC06E1C6955B2C3A9.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:705)", "rubyjit.Sinatra::Base$$call_E7297D83DF1A6A3B6C6430CFC06E1C6955B2C3A9.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:326)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)", "rubyjit.Rack::Protection::XSSHeader$$call_583981A7C5553C000641D80C19F025CB1E10CA57.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22)", "rubyjit.Rack::Protection::XSSHeader$$call_583981A7C5553C000641D80C19F025CB1E10CA57.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Protection::PathTraversal$$call_1FA61E7C557B7316A900834B49199A8901CF507F.chained_0_ensure_1$RUBY$ensure(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/path_traversal.rb:16)", "rubyjit.Rack::Protection::PathTraversal$$call_1FA61E7C557B7316A900834B49199A8901CF507F.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/path_traversal.rb)", "rubyjit.Rack::Protection::PathTraversal$$call_1FA61E7C557B7316A900834B49199A8901CF507F.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/path_traversal.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Protection::JsonCsrf$$call_BB197BD41FEE12D244A68A6C28D2451E579BEDA2.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/json_csrf.rb:17)", "rubyjit.Rack::Protection::JsonCsrf$$call_BB197BD41FEE12D244A68A6C28D2451E579BEDA2.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/json_csrf.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Protection::Base$$call_EF23885744C5A97C466705F2C222FE925519934C.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/base.rb:47)", "rubyjit.Rack::Protection::Base$$call_EF23885744C5A97C466705F2C222FE925519934C.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:326)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)", "rubyjit.Rack::Protection::XSSHeader$$call_583981A7C5553C000641D80C19F025CB1E10CA57.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22)", "rubyjit.Rack::Protection::XSSHeader$$call_583981A7C5553C000641D80C19F025CB1E10CA57.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Logger$$call_9B7411951859B64FADEEBE6D5C62AAF6DF4FA6CF.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/logger.rb:15)", "rubyjit.Rack::Logger$$call_9B7411951859B64FADEEBE6D5C62AAF6DF4FA6CF.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/logger.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::CommonLogger$$call_E0AEE62396EBD015D745DB8B89024865754E45E5.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/commonlogger.rb:20)", "rubyjit.Rack::CommonLogger$$call_E0AEE62396EBD015D745DB8B89024865754E45E5.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/commonlogger.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Head$$call_B3E31D34D8A282DD56671BF2AB8DCC94A0581272.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/head.rb:9)", "rubyjit.Rack::Head$$call_B3E31D34D8A282DD56671BF2AB8DCC94A0581272.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/head.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::MethodOverride$$call_5C4513A64D983C8019F0C2940E049E8355465D21.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/methodoverride.rb:21)", "rubyjit.Rack::MethodOverride$$call_5C4513A64D983C8019F0C2940E049E8355465D21.file(/home/rails/.rvm/gems/ruby-1.9.2-p318/gems/rack-1.4.1/lib/rack/methodoverride.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Sinatra::Base$$call_94E8BA21132402701DA13E650D75E342B14A9AE7.block_0$RUBY$file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334)", "rubyjit$Sinatra::Base$$call_94E8BA21132402701DA13E650D75E342B14A9AE7$block_0$RUBY$file.call(rubyjit$Sinatra::Base$$call_94E8BA21132402701DA13E650D75E342B14A9AE7$block_0$RUBY$file)", "org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:121)", "org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:96)", "org.jruby.runtime.Block.yieldSpecific(Block.java:99)", "rubyjit.Sinatra::Base$$synchronize_628CFC31708E3E9E2E780EF29F851B0BBD3689DF.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:1416)", "rubyjit.Sinatra::Base$$synchronize_628CFC31708E3E9E2E780EF29F851B0BBD3689DF.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:161)", "org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)", "org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)", "rubyjit.Sinatra::Base$$call_94E8BA21132402701DA13E650D75E342B14A9AE7.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334)", "rubyjit.Sinatra::Base$$call_94E8BA21132402701DA13E650D75E342B14A9AE7.file(/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/gems/gems/sinatra-1.3.2/lib/sinatra/base.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:168)", "rubyjit.Rack::Handler::Servlet$$call_70B35DDDBC7240FEE6A00DF14B77D46976C112A8.file(file:/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/lib/gems-gems-jruby-rack-1.1.13.1-lib-jruby-rack-1.1.13.1.jar!/rack/handler/servlet.rb:22)", "rubyjit.Rack::Handler::Servlet$$call_70B35DDDBC7240FEE6A00DF14B77D46976C112A8.file(file:/home/rails/apache-tomcat-7.0.30/webapps/cucumber-reporting-web/WEB-INF/lib/gems-gems-jruby-rack-1.1.13.1-lib-jruby-rack-1.1.13.1.jar!/rack/handler/servlet.rb)", "org.jruby.internal.runtime.methods.JittedMethod.call(JittedMethod.java:181)", "org.jruby.RubyClass.finvoke(RubyClass.java:741)", "org.jruby.javasupport.util.RuntimeHelpers.invoke(RuntimeHelpers.java:496)", "org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:358)", "org.jruby.javasupport.JavaEmbedUtils$1.callMethod(JavaEmbedUtils.java:143)", "org.jruby.rack.DefaultRackApplication.call(DefaultRackApplication.java:64)", "org.jruby.rack.AbstractRackDispatcher.process(AbstractRackDispatcher.java:33)", "org.jruby.rack.AbstractFilter.doFilter(AbstractFilter.java:66)", "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)", "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)", "org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)", "org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)", "org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)", "org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)", "org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)", "org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)", "org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)", "org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)", "org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)", "org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)", "org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)", "java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)", "java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)", "java.lang.Thread.run(Thread.java:679)"]

Display Undefined Steps

Cucumber will mark steps as "undefined" if there is no definition for them, but the reporting does not include this number which leads to some confusing reports like in the attached image.
screen shot 2014-11-04 at 17 07 00

Adding in a column for "undefined" steps would fix this issue

Maven central and version 0.0.18

A recent release of cucumber-jvm (https://groups.google.com/d/msg/cukes/P2l2g277qdg/W5neBFizyuIJ & https://groups.google.com/d/msg/cukes/P2l2g277qdg/mT_m_E70tboJ), has fixed an issue with the JSON output that had prevented me from using the standalone version of cucumber-reporting. Recently, I've returned to the stand alone version of cucumber-reporting in an attempt to integrate this fantastic tool within our framework.

However, I've noticed that when running a test that fails, the screenshot information is not being displayed within the report, even though the JSON information is available within the output generated by cucumber. The following is just a snippet of the output generated by cucumber-jvm

"embeddings":[{"mime_type":"image/png","data":"iVBORw0KGgoAAAANSUhEUgAAA9QAAAZfCAYAAABqm

...

I have also noticed that the current version listed under github is 0.0.19-SNAPSHOT. I've attempted to search for version 0.0.18 on Maven's central repository without any luck (http://search.maven.org/).

Has 0.0.18 been published to Maven central? Does version 0.0.18 contain the fix for inserting screenshots (#4)?

Step.java: condition is allways false (twice)

Name
   public method String getName()
Location
   class Step (net.masterthought.cucumber.json)
Problem synopsis
   Condition getStatus() == Util.Status.SKIPPED at line 111 is always false

This problem is also reported on line 114

Add ability to link reports to Jenkins test reports

Our team was looking into your Jenkins plugin, and we were thinking about adding the possibility to linking your cucumber reports to the test report for the same Jenkins build.

I have managed to shim a quick solution, which probably isn't the nicest :), I'll include the code in case you are interested and/or it helps explain what we were trying to do.

diff --git src/main/resources/templates/featureReport.vm src/main/resources/templates/featureReport.vm
index 958bca2..67275d5 100755
--- src/main/resources/templates/featureReport.vm
+++ src/main/resources/templates/featureReport.vm
@@ -204,8 +204,13 @@ table.data-table td {
            $feature.getDescription()

            #foreach($scenario in $scenarios)
+                #set ($featureJunitReportPath = $feature.getRawName())
+                #set ($scenarioJunitReportPath = $scenario.getRawName().replaceAll(" ", "_"))
+
                $scenario.getTagsList()
-                $scenario.getName()
+                <a href="${jenkins_base}job/$build_project/$build_number/testReport/(root)/$featureJunitReportPath/$scenarioJunitReportPath">
+                    $scenario.getName()
+                </a>
                #foreach($step in $scenario.getSteps().toList())
                $step.getName()
                    $step.getDocStringOrNothing()

there was an error generating the reports: org.apache.velocity.exception.VelocityException:

I was trying to generate cucumber reports and below is the crash that I am receiving

[CucumberReportPublisher] Compiling Cucumber Html Reports ...
[CucumberReportPublisher] copying all json files from slave: C:\Jenkins\workspace\Web-Test-Automation-Job to master reports directory: \192.168.1.240\Builds\Web-Test-Automation-Job\2014-08-12_16-32-54\cucumber-html-reports
[CucumberReportPublisher] Found the following number of json files: 3
[CucumberReportPublisher] 0. Found a json file: MintTest\target\cucumber-report-LinkTest.json
[CucumberReportPublisher] 1. Found a json file: MintTest\target\cucumber-report-LoginTest.json
[CucumberReportPublisher] 2. Found a json file: MintTest\target\cucumber-report-TransactionTest.json
[CucumberReportPublisher] Generating HTML reports
[CucumberReportPublisher] there was an error generating the reports: org.apache.velocity.exception.VelocityException: Error initializing log: Failed to initialize an instance of org.apache.velocity.runtime.log.Log4JLogChute with the current runtime configuration.
org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:875)
org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:262)
org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:646)
org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:116)
net.masterthought.cucumber.ReportBuilder.generateErrorPage(ReportBuilder.java:223)
net.masterthought.cucumber.ReportBuilder.generateReports(ReportBuilder.java:96)
net.masterthought.jenkins.CucumberReportPublisher.perform(CucumberReportPublisher.java:110)
hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:772)
hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:736)
hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.post2(MavenModuleSetBuild.java:1007)
hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:685)
hudson.model.Run.execute(Run.java:1757)
hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:506)
hudson.model.ResourceController.execute(ResourceController.java:88)
hudson.model.Executor.run(Executor.java:234)
Build step 'Publish cucumber results as a report' changed build result to FAILURE
Finished: FAILURE

ReportBuilder feature envy

I think that the class ReportBuilder does to much.
It prepares variables for the reports.
It starts the merging with a Freemarker template.
It writes the result to a file.
I think writing tests for this class is therefore to hard.
Should we use mockito to do the unittest?
How can we enhance testability?
Instantiation of classes is much harder to mock.
Should we use use powermockito or use factories which can be injected for mocking purposes?

No undefined, skipped and pending status for scenarios

In cucumber framework, when one of steps is pending or undefined, the scenario will be marked as pending or undefined; when all steps are skipped, then the scenario will be marked as skipped, but in cucumber-reporting, no matter scenario is pending, undefined or skipped, it is always marked as failed. I have attached a simple json report, could someone help me? Thanks in advance
[
{
"keyword": "Feature",
"name": "As a user",
"line": 1,
"description": " I want to know\n how scenario will show it's status",
"id": "as-a-user",
"uri": "features\status_test.feature",
"elements": [
{
"keyword": "Scenario",
"name": "Varify undefined status",
"line": 6,
"description": "",
"id": "as-a-user;varify-undefined-status",
"type": "scenario",
"steps": [
{
"keyword": "Given ",
"name": "I have a step which is undefined",
"line": 7,
"match": {
"location": "features\status_test.feature:7"
},
"result": {
"status": "undefined",
"duration": 1000000
}
},
{
"keyword": "Then ",
"name": "the scenario should be undefined",
"line": 8,
"match": {
"location": "features\status_test.feature:8"
},
"result": {
"status": "undefined",
"duration": 1000000
}
}
]
},
{
"keyword": "Scenario",
"name": "Varify pending status",
"line": 10,
"description": "",
"id": "as-a-user;varify-pending-status",
"type": "scenario",
"steps": [
{
"keyword": "Given ",
"name": "I have had a step which is pending",
"line": 11,
"match": {
"location": "features/step_definition/status_steps.rb:16"
},
"result": {
"status": "pending",
"error_message": "TODO (Cucumber::Pending)\n./features/step_definition/status_steps.rb:17:in /^I have had a step which is pending$/'\nfeatures\\status_test.feature:11:inGiven I have had a step which is pending'",
"duration": 4000000
}
},
{
"keyword": "Then ",
"name": "the scenario's status should be pending",
"line": 12,
"match": {
"location": "features/step_definition/status_steps.rb:20"
},
"result": {
"status": "skipped",
"duration": 2000000
}
}
]
}
]
}
]

Diff Report to compare results from current and previous build

A feature that I would love to see in cucumber-reporting is a diff report... something that tells me what has changed between the current report and the last report (or variations thereof).

For instance, I have seen the total number of features reported upon drop from one day to the next because a change to one feature caused it not to run at all. But the status report was all green before this happened and all green afterwards... and so it was hard to spot that something had changed. It would have helped to have been told that the total number of features had dropped.

Another use case: the feature status lists lots of (say) skipped steps... but the number has declined because someone has been fixing stuff. It would be useful to know that things are improving (or vice versa).

File not found exception : cucumber.json (No such file or directory)

Hello,

I'm seeing following error, on trying to run cucumber tests using cucumber-reporting.

[INFO] --- maven-cucumber-reporting:0.0.5:generate (execution) @ mygovscot_alpha ---
About to generate
java.io.FileNotFoundException: /Users/IdeaProjects/projectalpha/target/cucumber.json (No such file or directory)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.252 s
[INFO] Finished at: 2014-05-29T13:18:22+00:00
[INFO] Final Memory: 20M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal net.masterthought:maven-cucumber-reporting:0.0.5:generate (execution) on project project_alpha: Error Found: NullPointerException -> [Help 1]
[ERROR]

I've following settings in pom.xml.

<repositories>
    <repository>
        <id>repo.bodar.com</id>
        <url>http://repo.bodar.com</url>
    </repository>

    <repository>
        <id>sonatype-releases</id>
        <url>https://oss.sonatype.org/content/repositories/releases/</url>
    </repository>
</repositories>


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
             <version>2.16</version>
             <configuration>
                 <testFailureIgnore>true</testFailureIgnore>
             </configuration>
         </plugin>
         <plugin>
            <groupId>net.masterthought</groupId>
             <artifactId>maven-cucumber-reporting</artifactId>
             <version>${maven.cucumber.reporting.version}</version>
             <executions>
                <execution>
                    <id>execution</id>
                     <phase>verify</phase>
                    <goals>
                         <goal>generate</goal>
                     </goals>
                     <configuration>
                         <projectName>${project.name}</projectName>
                         <outputDirectory>${project.build.directory}/cucumber-html-reports</outputDirectory>
                         <cucumberOutput>${project.build.directory}/cucumber.json</cucumberOutput>
                         <enableFlashCharts>true</enableFlashCharts>
                     </configuration>
                 </execution>
             </executions>
         </plugin>
     </plugins>
 </build>

Following dependencies are included in pom.xml.

    <dependency>
        <groupId>net.masterthought</groupId>
        <artifactId>maven-cucumber-reporting</artifactId>
        <version>${maven.cucumber.reporting.version}</version>
    </dependency>

    <dependency>
        <groupId>net.masterthought</groupId>
        <artifactId>cucumber-reporting</artifactId>
        <version>${cucumber.reporting.version}</version>
    </dependency>

    <dependency>
        <groupId>com.googlecode.totallylazy</groupId>
        <artifactId>totallylazy</artifactId>
        <version>1077</version>
    </dependency>


    <dependency>
        <groupId>com.beust</groupId>
        <artifactId>jcommander</artifactId>
        <version>1.25</version>
    </dependency>

       <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>${org.hamcrest.hamcrest-all}</version>
       </dependency>

Could you please advise, if any one had seen this issue before. I've not configured any json file, please advise if any json file need to be configured to use this plugin.

I did search in the net to find similar issues, can't find any such & Not able to post any queries in cucumber-reporting user group. Apologies if this is not real issue, just need change in configuration.

if so, Kindly could you advise on configuration changes to fix this issue.

Thanks,
Raja

Failure to find com.googlecode.totallylazy:totallylazy.jar:991

Hi Kingsleyh,

I am trying to generate cucumber reports using Maven Mojo.

But I am not able to build project. Getting the below error while building using "mvn clean install" command.

[ERROR] Failed to execute goal on project XXXXX(Project_Name): Could not
resolve dependencies for project xxx.xxxx.xxxx.xxx:XXXXX(Project_Name):jar:1.0.0-SNAPSHOT: Failure to find com.googlecode.totallylazy:totally
lazy:jar:991 in https://nexus:8443/nexus/content/groups/public was cached in the
local repository, resolution will not be reattempted until the update interval
of NexusExternal has elapsed or updates are forced -> [Help 1]

I have added dependency and repository in pom.xml file as below,

com.googlecode.totallylazy totallylazy 991 repo.bodar.com http://repo.bodar.com

Please provide solution for this.

Thanks in advance.

Can you remove the .svn folder in the resource archive flash_charts.zip?

https://github.com/masterthought/cucumber-reporting/blob/master/src/main/resources/charts/flash_charts.zip

This is minor, but If you look at this zip file, there's a .svn directory in it. If you could remove that part of the .zip, it would help for us poor souls who still have SVN at work. When the directory is present, SVN tries to include it as a source directory and then the IDE freaks out trying to get to it :)

Thanks!
Hugh

Report Table Sorting

The Feature Statistics table is sorted by the feature file name but lists features by the feature text from inside the file. The Tag Statistics table is sorted I know not how.

It would be helpful if the columns in the tables were sortable on the fly. ie, sort by tag, sort by duration, sort by status, etc.

Release components

Could you please release the component with the latest fixes, and also update and release the maven and jenkins plugins.

Thank you,

Trouble with viewing flash-based graphs

I'm currently using version 0.0.17 of the standalone version. It's working quite well when run locally. We've recently created a Bamboo build plan to the tests and we run them using 'mvn clean verify'

This produces the expected reports based on our pom file settings -- we're using Bamboo's artifacts feature to view the reports. However, the graphs presented on the feature-overview.html page are not being displayed. They display just fine if the command is run locally (i.e., not through Bamboo). I've noticed a recent enhancement associated with the "jenkins-cucumber-jvm-reports-plugin-java" plugin

  • added an option in the advanced config to turn off the default flash charts and replace them with javascript charts

is this possible to do with the standalone plugin? And, if so, how?

test failure

$ mvn install


T E S T S

Running net.masterthought.cucumber.ElementTest
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.408 sec
Running net.masterthought.cucumber.RowTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec
Running net.masterthought.cucumber.StepTest
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.113 sec
Running net.masterthought.cucumber.ReportParserTest
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.1 sec
Running net.masterthought.cucumber.FeatureTest
Tests run: 17, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.514 sec <<< FAILURE!
Running net.masterthought.cucumber.ReportInformationTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.632 sec

Results :

Failed tests: shouldGetNumberOfFailingSteps(net.masterthought.cucumber.FeatureTest):
shouldGetNumberOfSkippedSteps(net.masterthought.cucumber.FeatureTest):

surefire-reports/net.masterthought.cucumber.FeatureTest.txt:

Test set: net.masterthought.cucumber.FeatureTest

Tests run: 17, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.514 sec <<< FAILURE!
shouldGetNumberOfFailingSteps(net.masterthought.cucumber.FeatureTest) Time elapsed: 0.021 sec <<< FAILURE!
java.lang.AssertionError:
Expected: is <1>
got: <4>

at org.junit.Assert.assertThat(Assert.java:780)
at org.junit.Assert.assertThat(Assert.java:738)
at net.masterthought.cucumber.FeatureTest.shouldGetNumberOfFailingSteps(FeatureTest.java:102)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

shouldGetNumberOfSkippedSteps(net.masterthought.cucumber.FeatureTest) Time elapsed: 0.016 sec <<< FAILURE!
java.lang.AssertionError:
Expected: is <3>
got: <0>

at org.junit.Assert.assertThat(Assert.java:780)
at org.junit.Assert.assertThat(Assert.java:738)
at net.masterthought.cucumber.FeatureTest.shouldGetNumberOfSkippedSteps(FeatureTest.java:108)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

raphael pie chart always blue when there is only 1 value

Hi,

Thanks for this tool, I like to contribute by reporting this bug and possibly adding a fix.

Issue:

When you only have one value, in my case:

steps.piechart(200, 150, 120, [9, 0, 0, 0], { legend: ["%%.%% - Passed", "%%.%% - Failed", "%%.%% - Skipped", "%%.%% - Pending"], legendpos: "east", colors: ["#88dd11","#88aaff","#cc1134","#FBB917"]});

The graph doesn't render, seem like it is an issue with Rapael char library. (Check this like from Stackoverflow: http://stackoverflow.com/questions/10871208/raphael-pie-chart-always-blue-when-there-is-only-1-value-how-to-set-color-of-a)

We can fix this (I think this is a hack but it works) replace 0 value with 0.000001 then the chart rendered... O.o

steps.piechart(200, 150, 120, [9, 0.000001, 0, 0], { legend: ["%%.%% - Passed", "%%.%% - Failed", "%%.%% - Skipped", "%%.%% - Pending"], legendpos: "east", colors: ["#88dd11","#88aaff","#cc1134","#FBB917"]});

Or we have to only put in one value like this by adding some condition:

 steps.piechart(200, 150, 120, [9], { legend: ["%%.%% - Passed", "%%.%% - Failed", "%%.%% - Skipped", "%%.%% - Pending"], legendpos: "east", colors: ["#88dd11","#88aaff","#cc1134","#FBB917"]});

I can put it a fix for now so people who use the JS chart can see something until we find more elegant solution. Or we can wait for Rapael to fix their lib then upgrade.

Thanks,

Far

Implement gherkin.formatter.Formatter?

I am running the cucumber-jvm cli and would love to provide a Formatter based on this reporter. Is that possible?

the cucumber.runtime.Main class is loading formatter information by way of a FormatterFactory.create(formatterString). There is flexibility there to provide a short name for the formatter or the full classpath for the formatter (as long as it extends Formatter) as well as an outputFile / directory.

A cucumber pending exception step results in a NullPointerException being thrown

I have a step that contains within it the following:

Given(~'^an unregistered user has successfully registered$') { ->
    throw new PendingException("""\
        | Unable to run the scenario until test code has been implemented to register an unregistered user""".stripMargin())
}

However, when I run mvn clean verify, the end result is a java.lang.NullPointerException. Here is a copy of the stacktrace

[ERROR] Failed to execute goal net.masterthought:maven-cucumber-reporting:0.0.3:generate (execution) on project dnote-acceptance-tests: Error Found: NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal net.masterthought:maven-cucumber-reporting:0.0.3:generate (execution) on project dnote-acceptance-tests: Error Found:
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error Found:
        at net.masterthought.cucumber.CucumberReportGeneratorMojo.execute(CucumberReportGeneratorMojo.java:70)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
        ... 19 more
Caused by: java.lang.NullPointerException
        at net.masterthought.cucumber.json.Step$predicates$1.matches(Step.java:171)
        at net.masterthought.cucumber.json.Step$predicates$1.matches(Step.java:168)
        at com.googlecode.totallylazy.iterators.FilterIterator.getNext(FilterIterator.java:20)
        at com.googlecode.totallylazy.iterators.StatefulIterator.hasNext(StatefulIterator.java:23)
        at com.googlecode.totallylazy.Iterators.size(Iterators.java:347)
        at com.googlecode.totallylazy.Sequences.size(Sequences.java:384)
        at com.googlecode.totallylazy.Sequence.size(Sequence.java:245)
        at net.masterthought.cucumber.json.Element.getStatus(Element.java:36)
        at net.masterthought.cucumber.ReportInformation.processFeatures(ReportInformation.java:225)
        at net.masterthought.cucumber.ReportInformation.<init>(ReportInformation.java:41)
        at net.masterthought.cucumber.ReportBuilder.<init>(ReportBuilder.java:39)
        at net.masterthought.cucumber.CucumberReportGeneratorMojo.execute(CucumberReportGeneratorMojo.java:61)
        ... 21 more

And, here is a copy of the generated cucumber.json file

[
  {
    "id": "login",
    "description": "As a DNOTE user\r\nI want to be able to login inside or outside of the network\r\nSo that I can do my job from home when needed",
    "name": "Login",
    "keyword": "Feature",
    "line": 1,
    "elements": [
      {
        "after": [
          {
            "result": {
              "duration": 267555648,
              "status": "passed"
            },
            "match": {
              "location": "env.groovy:35"
            }
          }
        ],
        "id": "login;a-newly-registered-user-logs-in-for-the-first-time",
        "tags": [
          {
            "name": "@US10842",
            "line": 19
          },
          {
            "name": "@pending_fix",
            "line": 19
          }
        ],
        "before": [
          {
            "result": {
              "duration": 3300185224,
              "status": "passed"
            },
            "match": {
              "location": "env.groovy:30"
            }
          }
        ],
        "description": "",
        "name": "A newly registered user logs in for the first time",
        "keyword": "Scenario",
        "line": 20,
        "steps": [
          {
            "result": {
              "duration": 136247996,
              "status": "pending",
              "error_message": "cucumber.api.PendingException:  Unable to run the scenario until test code has been implemented to register an unregistered user\r\n\tat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)\r\n\tat sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)\r\n\tat sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)\r\n\tat java.lang.reflect.Constructor.newInstance(Constructor.java:526)\r\n\tat org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)\r\n\tat org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)\r\n\tat org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)\r\n\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)\r\n\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)\r\n\tat studiotech.steps.LoginSteps$_run_closure3.doCall(LoginSteps.groovy:16)\r\n\tat ✽.Given an unregistered user has successfully registered(features\\login.feature:21)\r\n"
            },
            "name": "an unregistered user has successfully registered",
            "keyword": "Given ",
            "line": 21,
            "match": {
              "location": "LoginSteps.groovy:15"
            }
          },
          {
            "result": {
              "status": "skipped"
            },
            "name": "the user has been granted access",
            "keyword": "And ",
            "line": 22,
            "match": {
              "location": "LoginSteps.groovy:20"
            }
          },
          {
            "result": {
              "status": "skipped"
            },
            "name": "the user logs in with their credentials",
            "keyword": "When ",
            "line": 23,
            "match": {
              "location": "LoginSteps.groovy:50"
            }
          },
          {
            "result": {
              "status": "skipped"
            },
            "name": "the home page shall be displayed",
            "keyword": "Then ",
            "line": 24,
            "match": {
              "location": "LoginSteps.groovy:63"
            }
          }
        ],
        "type": "scenario"
      }
    ],
    "uri": "features\\login.feature"
  }
]

Get error when generate report by cucumber report

I tried to generate report in cmd: mvn clean verify. Then I got these error:

T E S T S

Running mgl.example.RunTest
@FIRST
Feature: Test drag-drop and scroll options

Scenario: Drag-drop and scroll must be OK # MoveAndScroll.feature:3
Given I move from the root role dialog to choosing picture # AddNewDevice.i_move_from_the_root_role_dialog_to_choosing_picture()
When I Choose picture and click continue # AddNewDevice.i_Choose_picture_and_click_continue()
Then I can drag-drop device and scroll options # AddNewDevice.i_can_drag_drop_device_and_scroll_options()

1 Scenarios (1 passed)
3 Steps (3 passed)
2m12.865s

Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 133.918 sec - in mgl.example.RunTest

Results :

Tests run: 4, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Example ---
[INFO] Building jar: /Users/enclaveit/Documents/workspace/Example/target/Example-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-cucumber-reporting:0.0.6:generate (execution) @ Example ---
About to generate
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:24 min
[INFO] Finished at: 2014-06-17T17:07:09+07:00
[INFO] Final Memory: 16M/200M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal net.masterthought:maven-cucumber-reporting:0.0.6:generate (execution) on project Example: Error Found: BUILD FAILED - Check Report For Details -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal net.masterthought:maven-cucumber-reporting:0.0.6:generate (execution) on project Example: Error Found:
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error Found:
at net.masterthought.cucumber.CucumberReportGeneratorMojo.execute(CucumberReportGeneratorMojo.java:86)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
... 19 more
Caused by: org.apache.maven.plugin.MojoExecutionException: BUILD FAILED - Check Report For Details
at net.masterthought.cucumber.CucumberReportGeneratorMojo.execute(CucumberReportGeneratorMojo.java:82)
... 21 more
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Can somebody help me?

theme size

The blue theme contains several files that seem to be unused in the reports:

  • images/slider
  • images/portfolio
  • monitor-img?.jpg
  • monitor.png
  • img*.jpg
  • social

Deleting these resources frees approx. 1 MB per report.
Is there a specific reason for including these files?
If not, could you please remove them?

Regards,
Harald Albers

parser json error does not display on the console

is it necessary to display error message throw by ReportBuilder ?

       try {
                ReportBuilder reportBuilder = new ReportBuilder(
                        fullPathToJsonFiles(jsonReportFiles, targetBuildDirectory),
                        targetBuildDirectory,
                        pluginUrlPath,
                        buildNumber,
                        buildProject,
                        skippedFails,
                        undefinedFails,
                        !noFlashCharts,
                        true,
                        false,
                        "",
                        false);
                reportBuilder.generateReports();
                buildResult = reportBuilder.getBuildStatus();
            } catch (Exception e) {
                e.printStackTrace();
            }

i think it is required.

Combining multiple json into one single report.

Hi,

We have different cucumber generated result json files for different project so viewing all of them in one place is possible with Jenkins ?

Is there a way to consolidate multiple cucumber report into one to make viewing easier ?

Regards,
Madhu

Tag Statistics are wrong

The tag statistic seem to encompase EVERYTHING, not just per tag results.

Here are some results:
tags1
You can see in steps all the tags have the same numbers. Here is the feature file content which show the tag distribution.
feature

(I noticed this on stand alone version including the cucumber-sandwich project)

Add line break after custom log entries

I do my custom log entry through Scenario.write(), and I add \n after each call. However, when being displayed in Jenkins, there's no line break between log entries. Will be much better if the line break can be honored.

Not compatible with cucumber JVM-1.0.9

I upgrade to Cucumber JVM 1.0.9 and tested my feature file.
Tested passed and result json file generated
I tried to generate the report using cucumber-reporting-0.0.22.jar

Error message

{code}
org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getName' in class net.masterthought.cucumber.json.Step threw exception java.lang.NullPointerException at templates/featureReport.vm[line 210, column 25]
{code}

Not able to build -- Compilation Error org.apache.maven.plugins:maven-compiler-plugin:2.5:compile

Hi,

I get the below error when building as mvn install

[INFO] Compiling 3 source files to /Users/saikrishna/Git/jenkins-cucumber-jvm-reports-plugin-java/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/saikrishna/Git/jenkins-cucumber-jvm-reports-plugin-java/src/main/java/net/masterthought/jenkins/CucumberReportPublisher.java:[99,46] cannot find symbol
symbol : constructor ReportBuilder(java.util.List<java.lang.String>,java.io.File,java.lang.String,java.lang.String,java.lang.String,boolean,boolean,boolean,boolean,boolean,java.lang.String,boolean,boolean)
location: class net.masterthought.cucumber.ReportBuilder
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12:32 min
[INFO] Finished at: 2014-10-11T00:04:36+05:30
[INFO] Final Memory: 24M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5:compile (default-compile) on project cucumber-reports: Compilation failure
[ERROR] /Users/saikrishna/Git/jenkins-cucumber-jvm-reports-plugin-java/src/main/java/net/masterthought/jenkins/CucumberReportPublisher.java:[99,46] cannot find symbol
[ERROR] symbol : constructor ReportBuilder(java.util.List<java.lang.String>,java.io.File,java.lang.String,java.lang.String,java.lang.String,boolean,boolean,boolean,boolean,boolean,java.lang.String,boolean,boolean)
[ERROR] location: class net.masterthought.cucumber.ReportBuilder
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Can someone help me fix this....

Regards,
Sai

Feature File Incorrectly Reports as "Passed"

With the "Feature Statistics" table lists a nice long set of features, the easiest way to get a feel for status is to let your eye sweep across the vista of green "passed" and alight on red "failed". If all is green you are done almost instantly. If there's a red status then you zero on it just as quickly.

So it's important that nothing is green and marked as passed when it should really be red and "failed".

This is a feature that I believe should be "failed"

should-be failed

There's a background section in which

Given X
And Z

was essentially simply tweaked to

Given X
And Y
And Z

Thus, for each of the 59 scenarios, until such time as a developer updates the support code for the feature, step X still passes but Y is Pending and Z is skipped.

So, no step actually failed. But that should not mean the scenario itself passed. I suggest that the scenario (and thus the feature) should be flagged as failed

None of the above is arguing that the user wont already spot that something is wrong simply by seeing that there's a lot of pending and skipped steps. But that means that they have to stop and think.

Extra scenario getting added for scenario outline in cucumber reports

@kingsleyh : I am using 0.0.23 cucmber-report plugin , 0.0.2 Cucumber Plugin with our Jenkins for the report generation . And I have a cucumber plugin of 1.1.8 with my IntelliJ IDE .

As we can see in the attached image , the extra dummy scenario is getting populated in Jenkins report for every scenario outline . So even there are only 6 scenarios (indicated green in the attached image) , the cucumber-report shows 9 count under the scenarios .

Could you please take a look into this and let us know if we are missing anything here .

Thanks in advance !

Cucumber-Report Link :
cucumber_jvm_html_reports_feature

Example scenario outline link :
screen shot 2014-09-08 at 3 19 05 pm

conversion uri to file name remove domain or first value

Hi,

In the cucumber.json
"uri": "com/mysite/web/steps/add_doc/AddDoc.feature"
becomes
mysite-web-steps-add_doc-AddDoc.feature.html
i think the good conversion is
com-mysite-web-steps-add_doc-AddDoc.feature.html (with the com in first)

Change
net.masterthought.cucumber.json.Feature.java
...
public String getFileName() {
List matches = new ArrayList();
for (String line : Splitter.onPattern("/|\").split(uri)) {
String modified = line.replaceAll(")|(", "");
modified = StringUtils.deleteWhitespace(modified).trim();
matches.add(modified);
}

    List<String> sublist = matches.subList(0, matches.size()); // 0 not 1 !!!!!

    matches = (sublist.size() == 0) ? matches : sublist;
    String fileName = Joiner.on("-").join(matches) + ".html";
    return fileName;
}

....

Regards.
Vincent D.

[Ruby] Scenario Outline examples are not included in the report

Scenario Outline examples are not included in the report, so it writes in the screen that the feature file fails, it may also write what step it failed on, but it won't show what example it was.

There's an "arguments" hash for the "match" in every step, should it not reflect where's the failure for every match?

cucumberReportPublisher shows success but some html files not created

Firstly, thanks for your cool plug in.

I am having a problem using it on windows 7 however. The same plugin seems to work find on ubuntu.

I have tried parsing the json report on your online parser and that is also fine.

So when the project builds, I get no error message;

[CucumberReportPublisher] Compiling Cucumber Html Reports ...
[CucumberReportPublisher] detected this build is running on the master
[CucumberReportPublisher] copying json to reports directory: C:\Jenkins\jobs\test_melbourne_mainline_uk1w7d-104567\builds\2014-02-07_10-25-50\cucumber-html-reports
[CucumberReportPublisher] Generating HTML reports

So it all looks fine. But not all the html reports are generated.

So the features-overview html just contains the following message. And it's correct: that html file doesn't exist.

java.io.FileNotFoundException: C:\Jenkins\jobs\run_cuke_tests\builds\2014-02-07_11-43-19\cucumber-html-reports\TestCaseId("FUN-WATCH-GRIFF-STUB-001").html (The filename, directory name, or volume label syntax is incorrect)

Do you have any ideas how to see where the html generation is failing?

NPE for json file without steps

Hi,

when you're at the beginning of a project, steps are often unimplemented. Cucumber-jvm (?) suggests to implement them throwing a PendingException.
This results in a json file without steps, like this:

  {
    "id": "some-unimplemented-feature",
    "description": "Test for Steps which throw a PendingException",
    "name": "some name",
    "keyword": "Feature",
    "line": 1,
    "elements": [
      {
        "id": "some-feature;xyz",
        "description": "      some description",
        "name": "some name",
        "keyword": "Scenario",
        "line": 7,
        "type": "scenario"
      }
    ],
    "uri": "com/what/ever/some.feature"
  }
]

This leads to a NullpointerException when running the json file through the ReportInformation-class:

    at net.masterthought.cucumber.util.Util.collectSteps(Util.java:104)
    at net.masterthought.cucumber.json.Element.getStatus(Element.java:31)
    at net.masterthought.cucumber.ReportInformation.processFeatures(ReportInformation.java:184)
    at net.masterthought.cucumber.ReportInformation.<init>(ReportInformation.java:37)
    at net.masterthought.cucumber.ReportInformationTest.setUpReportInformation(ReportInformationTest.java:31)
```...

This can be reproduced using the Jenkins Cucumber-JVM plugin or the test net.masterthought.cucumber.ReportInformationTest.shouldListAllFeatures

Feature (details) page is wrong for consolidated reports

I have the following feature file

@all
Feature: Search
As a user
I want to find stuff
So that I can use it

  @a
  Scenario: tag a
    Given tag "a"

  @b
  Scenario: tag b
    Given tag "b"

  @c
  Scenario: tag c
    Given tag "c"

and I run cucumber tests on Jenkins three times with mvn test and the following properties:

cucumber.options=src/test/resources/features --tags @a --format pretty:STDOUT --format html:target/cucumber-a --format json:target/cucumber-a.json

The tag and the file name for the json file are adjusted for each run.

The features overview table looks like this, which is OKish (though I wouldn't have minded consolidation into one row here):
features-overview

However, every single link points to the same page, which only shows the last test run:
feature-details

The details for tags @A and @b are thus missing...

Reports generated with no information of test results

I am using cucumber reporting for generating html reports from JSON output file.
I have the following code in a method generateReports()

    File reportOutputDirectory = new File("./target/cucumber-html-reports");
    List<String> jsonReportFiles = new ArrayList<String>();
    jsonReportFiles.add("./target/JsonResults/cucumber.json");

    String buildNumber = "1";
    String buildProject = "VCI AATs";
    Boolean skippedFails = false;
    Boolean undefinedFails = false;
    Boolean flashCharts = true;
    Boolean runWithJenkins = false;
    Boolean artifactsEnabled = false;
    Boolean highCharts = false;
    String artifactConfig = "";
    String pluginUrlPath = "";
    ReportBuilder reportBuilder = new ReportBuilder(jsonReportFiles, reportOutputDirectory, pluginUrlPath, buildNumber, buildProject,
            skippedFails, undefinedFails, flashCharts, runWithJenkins, artifactsEnabled, artifactConfig, highCharts);
    reportBuilder.generateReports();

I call this method in AfterClass

@RunWith(Cucumber.class)
@CucumberOptions(features = { "classpath:features/" }, format = { "json:target/JsonResults/cucumber.json" }, dryRun = false)
public class CucumberTestsRun {

@BeforeClass
public static void setup() {
    System.out.println("Ran before");
}

@AfterClass
public static void teardown() throws Exception {
    System.out.println("Ran after");
    GenerateReports.generateReports();
}

}

I run the java project using JUnit and it generates the reports folder and the html files in it but when I open the files, they have no information about the scenarios that were run. I have checked the cucumber.json file and it has test results.
reports_cucumber

What am I missing here? Is the cucumber.json file empty when @afterclass is called and filled with data after that?

miss output in json report

part of json report, like this:

{
"result": {
"duration": 6215536732,
"status": "passed"
},
"name": "在360综合搜索中搜索"Error"",
"keyword": "当",
"line": 26,
"match": {
"arguments": [
{
"val": "Error",
"offset": 12
}
],
"location": "360Search_Steps.groovy:24"
},
"output": [
"some text display on report!"
]
}

Tags not being reported correctly

Unless I misunderstand intention of the tagging, the per-tag summary and individual tag reports are including scenarios for all tags.

Below is a simple example of this problem.

Given that I have a feature file containing 4 scenarios
And 2 scenarios are tagged with @tag1
And other 2 scenarios are tagged with @tag2
When I view the tag1 report
Then the tag1 report should have a total of 2 scenarios

However, the tag1 report has a total of 4 scenarios.

The source json looks correct to me and I have validated it using http://cucumber-reporting.masterthought.net/.

This problem happens with

  • net.masterthought.cucumber-reporting:0.0.21
  • Ubuntu 12 and 13
  • Ruby 1.9.3 and Ruby 2
  • JDK 1.7 and openJDK6 and openJDK7
  • chrome and firefox

Please let me know if any other info would help troubleshoot this problem.

This report looks correct to me:
cukerpt_allscens

However, this report shows each tag having 4 scenarios each when they only have 2 each:
cukerpt_tagstats

...and this report (just for tag1) shows it as having 4 scenarios when it only has 2.

cukerpt_singletagreport

Cucumber-Ruby with no Jenkins?

Hi,

I looked into this project and it seems to be very focused on Cucumber-jvm with the setup of Jenkins (however I did find some mentions of running this without Jenkins it was still related to Java).

I was wondering if there is any option to run the wonderful cucumber reports on Cucumber Ruby and no Jenkins, if so, how?

"Output" JSON field is ignored in the HTML report

I would be nice to include the "output" value in the HTML report (like it is in the builtin default html report).
This make the users to be able to read the details added by the scenario.write("custom text") calls during the test process.
Pretty useful to display some config ou extra parameters read from external text files, for instance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.