{"action":"closed","number":175,"pull_request":{"url":"https://api.github.com/repos/ARMmbed/greentea/pulls/175","id":79383585,"html_url":"https://github.com/ARMmbed/greentea/pull/175","diff_url":"https://github.com/ARMmbed/greentea/pull/175.diff","patch_url":"https://github.com/ARMmbed/greentea/pull/175.patch","issue_url":"https://api.github.com/repos/ARMmbed/greentea/issues/175","number":175,"state":"closed","locked":false,"title":"Added support for Testlink","user":{"login":"ConorPKeegan","id":9019335,"avatar_url":"https://avatars.githubusercontent.com/u/9019335?v=3","gravatar_id":"","url":"https://api.github.com/users/ConorPKeegan","html_url":"https://github.com/ConorPKeegan","followers_url":"https://api.github.com/users/ConorPKeegan/followers","following_url":"https://api.github.com/users/ConorPKeegan/following{/other_user}","gists_url":"https://api.github.com/users/ConorPKeegan/gists{/gist_id}","starred_url":"https://api.github.com/users/ConorPKeegan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ConorPKeegan/subscriptions","organizations_url":"https://api.github.com/users/ConorPKeegan/orgs","repos_url":"https://api.github.com/users/ConorPKeegan/repos","events_url":"https://api.github.com/users/ConorPKeegan/events{/privacy}","received_events_url":"https://api.github.com/users/ConorPKeegan/received_events","type":"User","site_admin":false},"body":"# Changes\r\n* Added support for new test_spec.json format\r\n  * Will extract the test cases for each binary\r\n  * Backwards compatibility so nothing changes if the test cases are not specified\r\n* Added support for the filtering of tests by test case\r\n* Added support for the parsing of a Testlink test plan with command line switch `--testlink-test-plan <FILE>`\r\n  * Chooses the tests to run based on the test cases specified\r\n* Added command line switch to output all of the test casesfound, for all of the builds `--list-test-cases`\r\n* Added command line switch to ouput all of the test cases from the test plan, showing the implemented, not implemented, and conflicting, using `--list-test-plan`\r\n* Added exporter to produce report for Testlink in XML format\r\n* Added command line switch `--report-testlink-xml <FILE>` to output the Testlink XML format to a file\r\n* Updated README to include information on Testlink Integration\r\n\r\n# Test Spec Format\r\nExample of the current format:\r\n```\r\n{\r\n  \"builds\": {\r\n    \"K64F-ARM\": {\r\n      \"binary_type\": \"bootable\", \r\n      \"tests\": {\r\n        \"features-storage-tests-cfstore-flash_set\": {\r\n          \"binaries\": [\r\n            {\r\n              \"path\": \".build/tests/K64F/ARM/features/storage/TESTS/cfstore/flash_set/features-storage-tests-cfstore-flash_set.bin\"\r\n            }\r\n          ]\r\n        . . .\r\n```\r\nExample of the new format (Note the addition of the test cases):\r\n```\r\n{\r\n  \"builds\": {\r\n    \"K64F-ARM\": {\r\n      \"binary_type\": \"bootable\", \r\n      \"tests\": {\r\n        \"features-storage-tests-cfstore-flash_set\": {\r\n          \"binaries\": [\r\n            {\r\n              \"path\": \".build/tests/K64F/ARM/features/storage/TESTS/cfstore/flash_set/features-storage-tests-cfstore-flash_set.bin\"\r\n            }\r\n          ],\r\n        \"testcases\": [\r\n          \"FLASH_SET_test_01_start\", \r\n          \"FLASH_SET_test_01_end\"\r\n        ]\r\n        . . .\r\n```\r\n\r\n# Test Plan Format\r\nExample of a `test_plan.json`:\r\n```\r\n{\r\n    \"testplan\": {\r\n        \"name\": \"Test Plan Name\",\r\n        \"testcases\": [\r\n            {\"name\": \"Test Case Name\", \"properties\": { Reserved for future use }},\r\n            . . . \r\n```\r\n\r\n# List Test Cases\r\nExample output of `--list-test-cases:\r\n```\r\nmbedgt: available test cases for test '.build/tests/K64F/IAR/features/storage/TESTS/cfstore/open/features-storage-tests-cfstore-open.bin'\r\n        test case 'OPEN_test_05_end'\r\n        test case 'OPEN_test_03_start'\r\n        test case 'OPEN_test_02_end'\r\n        test case 'OPEN_test_04_end'\r\n        test case 'OPEN_test_05_start'\r\n        test case 'OPEN_test_06_end'\r\n        test case 'OPEN_test_06_start'\r\n        test case 'OPEN_test_01_start'\r\n        test case 'OPEN_test_04_start'\r\n        test case 'OPEN_test_00'\r\n        test case 'OPEN_test_02_start'\r\n        test case 'OPEN_test_03_end'\r\n        test case 'OPEN_test_01_end'\r\n        test case 'OPEN_test_07_start'\r\n        test case 'OPEN_test_07_end'\r\nmbedgt: available test cases for test '.build/tests/K64F/ARM/frameworks/utest/TESTS/unit_tests/case_control_async/frameworks-utest-tests-unit_tests-case_control_async.bin'\r\n        test case 'Control: Timeout (Failure)'\r\n        test case 'Control: CaseNext'\r\n        test case 'Control: NoTimeout'\r\n        test case 'Control: Await'\r\n        test case 'Control: Timeout (Success)'\r\n        test case 'Control: RepeatHandlerOnTimeout'\r\n        test case 'Control: RepeatAllOnTimeout'\r\n```\r\n\r\n# List Test Plan\r\nAn example output of `--list-test-plan`:\r\n```\r\n$ mbedgt -V --list-test-plan --test-plan test_plan.json\r\nmbedgt: greentea test automation tool ver. 1.2.0\r\nmbedgt: using multiple test specifications from current directory!\r\n        using '.build\\tests\\K64F\\ARM\\test_spec.json'\r\n        using '.build\\tests\\K64F\\GCC_ARM\\test_spec.json'\r\n        using '.build\\tests\\K64F\\IAR\\test_spec.json'\r\nmbedgt: using Test Plan 'Name'\r\nmbedgt: implemented test cases\r\n        test case 'FLASH_SET_test_01_start'\r\n        test case 'FLASH_SET_test_01_end'\r\n        test case 'Control: NoRepeat'\r\n        test case 'Control: RepeatHandler'\r\n        test case 'Control: RepeatAll'\r\n        test case 'Control: CaseNext'\r\n        test case 'tests-mbedmicro-rtos-mbed-queue'\r\n        test case 'features-feature_ipv4-tests-mbedmicro-net-nist_internet_time_service'\r\n        test case 'tests-mbedmicro-mbed-call_before_main'\r\n        test case 'tests-mbedmicro-rtos-mbed-mail'\r\n        test case 'C strings: strpbrk'\r\n        test case 'C strings: %g %g float formatting'\r\n        test case 'C strings: %f %f float formatting'\r\n        test case 'C strings: %u %d integer formatting'\r\n        test case 'C strings: strtok'\r\n        test case 'C strings: %i %d integer formatting'\r\n        test case 'C strings: %e %E float formatting'\r\n        test case 'C strings: %x %E integer formatting'\r\n        test case 'READ_test_01_start'\r\n        test case 'READ_test_01_end'\r\n        test case 'READ_test_00'\r\n        test case 'READ_test_02_start'\r\n        test case 'READ_test_02_end'\r\n        test case 'tests-mbedmicro-mbed-div'\r\nmbedgt: conflicting test cases (name is not unique)\r\n        test case 'Repeating Test'\r\n        test case 'dummy test 2'\r\n        test case 'Minimal Scheduler: Case 1'\r\n        test case 'Control: CaseNext'\r\n        test case 'initialize'\r\n        test case 'Simple Test'\r\n        test case 'dummy test'\r\n        test case 'Minimal Scheduler: Case 2'\r\n        test case 'Minimal Scheduler: Case 3'\r\n```\r\n\r\n# Testlink XML Report\r\nAn example of the outputted report is:\r\n```\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<testsuite failures=\"0\" tests=\"6\" errors=\"1\" time=\"0.149999856949\">\r\n    <testcase classname=\"FLASH_SET_test_01_start\" host_os=\"Windows\" name=\"FLASH_SET_test_01_start\" time=\"0.0499999523163\">\r\n        <error>\r\n    </testcase>\r\n    <testcase classname=\"FLASH_SET_test_01_start\" host_os=\"Windows\" name=\"FLASH_SET_test_01_start\" time=\"0.0499999523163\"></testcase>\r\n    <testcase classname=\"FLASH_SET_test_01_start\" host_os=\"Windows\" name=\"FLASH_SET_test_01_start\" time=\"0.0499999523163\"></testcase>\r\n</testsuite>\r\n```\r\n\r\n# Replaces\r\n* This PR replaces #172 ","created_at":"2016-07-29T16:03:09Z","updated_at":"2016-10-18T14:33:16Z","closed_at":"2016-10-18T14:33:16Z","merged_at":"2016-10-18T14:33:15Z","merge_commit_sha":"21ce6e5c5a52f3b03696c32e9e933f6760b46be1","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ARMmbed/greentea/pulls/175/commits","review_comments_url":"https://api.github.com/repos/ARMmbed/greentea/pulls/175/comments","review_comment_url":"https://api.github.com/repos/ARMmbed/greentea/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ARMmbed/greentea/issues/175/comments","statuses_url":"https://api.github.com/repos/ARMmbed/greentea/statuses/d9e68d7a23b511934561f14ce0370143a9b42c36","head":{"label":"ConorPKeegan:devel_testlink_test_case_support","ref":"devel_testlink_test_case_support","sha":"d9e68d7a23b511934561f14ce0370143a9b42c36","user":{"login":"ConorPKeegan","id":9019335,"avatar_url":"https://avatars.githubusercontent.com/u/9019335?v=3","gravatar_id":"","url":"https://api.github.com/users/ConorPKeegan","html_url":"https://github.com/ConorPKeegan","followers_url":"https://api.github.com/users/ConorPKeegan/followers","following_url":"https://api.github.com/users/ConorPKeegan/following{/other_user}","gists_url":"https://api.github.com/users/ConorPKeegan/gists{/gist_id}","starred_url":"https://api.github.com/users/ConorPKeegan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ConorPKeegan/subscriptions","organizations_url":"https://api.github.com/users/ConorPKeegan/orgs","repos_url":"https://api.github.com/users/ConorPKeegan/repos","events_url":"https://api.github.com/users/ConorPKeegan/events{/privacy}","received_events_url":"https://api.github.com/users/ConorPKeegan/received_events","type":"User","site_admin":false},"repo":{"id":63320181,"name":"greentea","full_name":"ConorPKeegan/greentea","owner":{"login":"ConorPKeegan","id":9019335,"avatar_url":"https://avatars.githubusercontent.com/u/9019335?v=3","gravatar_id":"","url":"https://api.github.com/users/ConorPKeegan","html_url":"https://github.com/ConorPKeegan","followers_url":"https://api.github.com/users/ConorPKeegan/followers","following_url":"https://api.github.com/users/ConorPKeegan/following{/other_user}","gists_url":"https://api.github.com/users/ConorPKeegan/gists{/gist_id}","starred_url":"https://api.github.com/users/ConorPKeegan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ConorPKeegan/subscriptions","organizations_url":"https://api.github.com/users/ConorPKeegan/orgs","repos_url":"https://api.github.com/users/ConorPKeegan/repos","events_url":"https://api.github.com/users/ConorPKeegan/events{/privacy}","received_events_url":"https://api.github.com/users/ConorPKeegan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ConorPKeegan/greentea","description":"\"Generic Regression Environment for test automation\" for mbed","fork":true,"url":"https://api.github.com/repos/ConorPKeegan/greentea","forks_url":"https://api.github.com/repos/ConorPKeegan/greentea/forks","keys_url":"https://api.github.com/repos/ConorPKeegan/greentea/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ConorPKeegan/greentea/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ConorPKeegan/greentea/teams","hooks_url":"https://api.github.com/repos/ConorPKeegan/greentea/hooks","issue_events_url":"https://api.github.com/repos/ConorPKeegan/greentea/issues/events{/number}","events_url":"https://api.github.com/repos/ConorPKeegan/greentea/events","assignees_url":"https://api.github.com/repos/ConorPKeegan/greentea/assignees{/user}","branches_url":"https://api.github.com/repos/ConorPKeegan/greentea/branches{/branch}","tags_url":"https://api.github.com/repos/ConorPKeegan/greentea/tags","blobs_url":"https://api.github.com/repos/ConorPKeegan/greentea/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ConorPKeegan/greentea/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ConorPKeegan/greentea/git/refs{/sha}","trees_url":"https://api.github.com/repos/ConorPKeegan/greentea/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ConorPKeegan/greentea/statuses/{sha}","languages_url":"https://api.github.com/repos/ConorPKeegan/greentea/languages","stargazers_url":"https://api.github.com/repos/ConorPKeegan/greentea/stargazers","contributors_url":"https://api.github.com/repos/ConorPKeegan/greentea/contributors","subscribers_url":"https://api.github.com/repos/ConorPKeegan/greentea/subscribers","subscription_url":"https://api.github.com/repos/ConorPKeegan/greentea/subscription","commits_url":"https://api.github.com/repos/ConorPKeegan/greentea/commits{/sha}","git_commits_url":"https://api.github.com/repos/ConorPKeegan/greentea/git/commits{/sha}","comments_url":"https://api.github.com/repos/ConorPKeegan/greentea/comments{/number}","issue_comment_url":"https://api.github.com/repos/ConorPKeegan/greentea/issues/comments{/number}","contents_url":"https://api.github.com/repos/ConorPKeegan/greentea/contents/{+path}","compare_url":"https://api.github.com/repos/ConorPKeegan/greentea/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ConorPKeegan/greentea/merges","archive_url":"https://api.github.com/repos/ConorPKeegan/greentea/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ConorPKeegan/greentea/downloads","issues_url":"https://api.github.com/repos/ConorPKeegan/greentea/issues{/number}","pulls_url":"https://api.github.com/repos/ConorPKeegan/greentea/pulls{/number}","milestones_url":"https://api.github.com/repos/ConorPKeegan/greentea/milestones{/number}","notifications_url":"https://api.github.com/repos/ConorPKeegan/greentea/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ConorPKeegan/greentea/labels{/name}","releases_url":"https://api.github.com/repos/ConorPKeegan/greentea/releases{/id}","deployments_url":"https://api.github.com/repos/ConorPKeegan/greentea/deployments","created_at":"2016-07-14T09:01:34Z","updated_at":"2016-07-14T09:01:35Z","pushed_at":"2016-09-05T09:40:12Z","git_url":"git://github.com/ConorPKeegan/greentea.git","ssh_url":"git@github.com:ConorPKeegan/greentea.git","clone_url":"https://github.com/ConorPKeegan/greentea.git","svn_url":"https://github.com/ConorPKeegan/greentea","homepage":"","size":748,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ARMmbed:testlink","ref":"testlink","sha":"df75292cc49109ebbf76320479bc9313b4cb1f21","user":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars.githubusercontent.com/u/8916057?v=3","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"repo":{"id":27880964,"name":"greentea","full_name":"ARMmbed/greentea","owner":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars.githubusercontent.com/u/8916057?v=3","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ARMmbed/greentea","description":"\"Generic Regression Environment for test automation\" for mbed","fork":false,"url":"https://api.github.com/repos/ARMmbed/greentea","forks_url":"https://api.github.com/repos/ARMmbed/greentea/forks","keys_url":"https://api.github.com/repos/ARMmbed/greentea/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ARMmbed/greentea/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ARMmbed/greentea/teams","hooks_url":"https://api.github.com/repos/ARMmbed/greentea/hooks","issue_events_url":"https://api.github.com/repos/ARMmbed/greentea/issues/events{/number}","events_url":"https://api.github.com/repos/ARMmbed/greentea/events","assignees_url":"https://api.github.com/repos/ARMmbed/greentea/assignees{/user}","branches_url":"https://api.github.com/repos/ARMmbed/greentea/branches{/branch}","tags_url":"https://api.github.com/repos/ARMmbed/greentea/tags","blobs_url":"https://api.github.com/repos/ARMmbed/greentea/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ARMmbed/greentea/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ARMmbed/greentea/git/refs{/sha}","trees_url":"https://api.github.com/repos/ARMmbed/greentea/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ARMmbed/greentea/statuses/{sha}","languages_url":"https://api.github.com/repos/ARMmbed/greentea/languages","stargazers_url":"https://api.github.com/repos/ARMmbed/greentea/stargazers","contributors_url":"https://api.github.com/repos/ARMmbed/greentea/contributors","subscribers_url":"https://api.github.com/repos/ARMmbed/greentea/subscribers","subscription_url":"https://api.github.com/repos/ARMmbed/greentea/subscription","commits_url":"https://api.github.com/repos/ARMmbed/greentea/commits{/sha}","git_commits_url":"https://api.github.com/repos/ARMmbed/greentea/git/commits{/sha}","comments_url":"https://api.github.com/repos/ARMmbed/greentea/comments{/number}","issue_comment_url":"https://api.github.com/repos/ARMmbed/greentea/issues/comments{/number}","contents_url":"https://api.github.com/repos/ARMmbed/greentea/contents/{+path}","compare_url":"https://api.github.com/repos/ARMmbed/greentea/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ARMmbed/greentea/merges","archive_url":"https://api.github.com/repos/ARMmbed/greentea/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ARMmbed/greentea/downloads","issues_url":"https://api.github.com/repos/ARMmbed/greentea/issues{/number}","pulls_url":"https://api.github.com/repos/ARMmbed/greentea/pulls{/number}","milestones_url":"https://api.github.com/repos/ARMmbed/greentea/milestones{/number}","notifications_url":"https://api.github.com/repos/ARMmbed/greentea/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ARMmbed/greentea/labels{/name}","releases_url":"https://api.github.com/repos/ARMmbed/greentea/releases{/id}","deployments_url":"https://api.github.com/repos/ARMmbed/greentea/deployments","created_at":"2014-12-11T16:39:08Z","updated_at":"2016-10-09T06:07:59Z","pushed_at":"2016-10-18T14:33:16Z","git_url":"git://github.com/ARMmbed/greentea.git","ssh_url":"git@github.com:ARMmbed/greentea.git","clone_url":"https://github.com/ARMmbed/greentea.git","svn_url":"https://github.com/ARMmbed/greentea","homepage":"","size":883,"stargazers_count":11,"watchers_count":11,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":20,"forks":21,"open_issues":20,"watchers":11,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/greentea/pulls/175"},"html":{"href":"https://github.com/ARMmbed/greentea/pull/175"},"issue":{"href":"https://api.github.com/repos/ARMmbed/greentea/issues/175"},"comments":{"href":"https://api.github.com/repos/ARMmbed/greentea/issues/175/comments"},"review_comments":{"href":"https://api.github.com/repos/ARMmbed/greentea/pulls/175/comments"},"review_comment":{"href":"https://api.github.com/repos/ARMmbed/greentea/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ARMmbed/greentea/pulls/175/commits"},"statuses":{"href":"https://api.github.com/repos/ARMmbed/greentea/statuses/d9e68d7a23b511934561f14ce0370143a9b42c36"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"mazimkhan","id":13520658,"avatar_url":"https://avatars.githubusercontent.com/u/13520658?v=3","gravatar_id":"","url":"https://api.github.com/users/mazimkhan","html_url":"https://github.com/mazimkhan","followers_url":"https://api.github.com/users/mazimkhan/followers","following_url":"https://api.github.com/users/mazimkhan/following{/other_user}","gists_url":"https://api.github.com/users/mazimkhan/gists{/gist_id}","starred_url":"https://api.github.com/users/mazimkhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mazimkhan/subscriptions","organizations_url":"https://api.github.com/users/mazimkhan/orgs","repos_url":"https://api.github.com/users/mazimkhan/repos","events_url":"https://api.github.com/users/mazimkhan/events{/privacy}","received_events_url":"https://api.github.com/users/mazimkhan/received_events","type":"User","site_admin":false},"comments":6,"review_comments":11,"commits":15,"additions":632,"deletions":85,"changed_files":8}}
{"actor":{"display_login":"mazimkhan"}}