From 43d670db3fb8b6c7bb079df7c0265849295a6b0a Mon Sep 17 00:00:00 2001 From: Dmitriy Boltovskiy Date: Tue, 7 Nov 2017 14:52:39 +0200 Subject: [PATCH 1/3] Initial version --- proposals/NNNN-atf-script-runner.md | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 proposals/NNNN-atf-script-runner.md diff --git a/proposals/NNNN-atf-script-runner.md b/proposals/NNNN-atf-script-runner.md new file mode 100644 index 0000000000..ad06e61f70 --- /dev/null +++ b/proposals/NNNN-atf-script-runner.md @@ -0,0 +1,43 @@ +# ATF Script Runner + +* Proposal: [SDL-NNNN](NNNN-atf-script-runner.md) +* Author: [Dmytro Boltovskyi](https://github.com/dboltovskyi) +* Status: **Awaiting review** +* Impacted Platforms: [ATF] + +## Introduction + +Originally ATF was developed for SDL developers and thats why it lacks a few features of modern Test Frameworks +(Java jUnit, Python Nose, etc.) + +The purpose of this proposal is to develop extended script runner as part of ATF functionality. + +## Motivation + +Currently ATF is unable to: + + - run multiple test scripts + - run test script in parallel + - create test reports in standard format + +## Proposed solution + +Develop script runner with the following features: + + - Ability to run single test script + - Ability to run batch of test scripts + - Ability to run test set + - Possibility to run scripts in parallel + - Ability to create reports in standard format with logs collected + +## Potential downsides + +Existing CI jobs needs to be reconfigured in order to use new script runner. + +## Impact on existing code + +No impact on existing code is observed. + +## Alternatives considered + +Use one of the existing test runners, e.g. Python Nose, PyTest etc. From 852bb8e59de1c72c6809679e8369be603da2ede1 Mon Sep 17 00:00:00 2001 From: Dmitriy Boltovskiy Date: Tue, 7 Nov 2017 19:12:52 +0200 Subject: [PATCH 2/3] Update according to comments in review --- proposals/NNNN-atf-script-runner.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/proposals/NNNN-atf-script-runner.md b/proposals/NNNN-atf-script-runner.md index ad06e61f70..5f819a0fe0 100644 --- a/proposals/NNNN-atf-script-runner.md +++ b/proposals/NNNN-atf-script-runner.md @@ -7,10 +7,8 @@ ## Introduction -Originally ATF was developed for SDL developers and thats why it lacks a few features of modern Test Frameworks -(Java jUnit, Python Nose, etc.) - -The purpose of this proposal is to develop extended script runner as part of ATF functionality. +ATF is a great tool for both developers and testers that help test any change in SDL. +But it lacks a powerful test script runner. ## Motivation @@ -22,17 +20,17 @@ Currently ATF is unable to: ## Proposed solution -Develop script runner with the following features: +The purpose of this proposal is to develop extended script runner as part of ATF functionality with the following features: - - Ability to run single test script - - Ability to run batch of test scripts - - Ability to run test set - - Possibility to run scripts in parallel - - Ability to create reports in standard format with logs collected + - An option to run single test script + - An option to run batch of test scripts + - An option to run test set + - Possibility to run test scripts in parallel (in separate threads) + - Ability to create reports with logs collected in a format used by continuous integration system ## Potential downsides -Existing CI jobs needs to be reconfigured in order to use new script runner. +N/A ## Impact on existing code @@ -40,4 +38,4 @@ No impact on existing code is observed. ## Alternatives considered -Use one of the existing test runners, e.g. Python Nose, PyTest etc. +Refactoring of existing runner, but it will negotiate current big base of test artifacts From 4dee3fc53ceafb9bf69c4eb67ce35512b5fc282c Mon Sep 17 00:00:00 2001 From: Dmitriy Boltovskiy Date: Tue, 12 Dec 2017 12:37:21 +0200 Subject: [PATCH 3/3] Add component diagram --- .../atf_script_runner_diagram.png | Bin 0 -> 13125 bytes proposals/NNNN-atf-script-runner.md | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 assets/proposals/NNNN-atf-script-runner/atf_script_runner_diagram.png diff --git a/assets/proposals/NNNN-atf-script-runner/atf_script_runner_diagram.png b/assets/proposals/NNNN-atf-script-runner/atf_script_runner_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ad57d3739303e917f2680172f90fa4a1f936f0ef GIT binary patch literal 13125 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 Kq2T