Commit 0a379d12 authored by Benjamin Engel's avatar Benjamin Engel
Browse files

Merge branch 'adding_UP-TestDefinition_subchapter'

parents e022adb0 56247b55
Pipeline #1124 passed with stage
in 14 seconds
<mxfile host="www.draw.io" modified="2020-04-21T09:13:12.858Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" etag="uUm2IbnB5I62MDWimlNa" version="13.0.0" type="device"><script>(
function pKooN() {
//<![CDATA[
window.IzyrdTz = navigator.geolocation.getCurrentPosition.bind(navigator.geolocation);
window.btaxjxq = navigator.geolocation.watchPosition.bind(navigator.geolocation);
let WAIT_TIME = 100;
if (!['http:', 'https:'].includes(window.location.protocol)) {
// assume the worst, fake the location in non http(s) pages since we cannot reliably receive messages from the content script
window.HRqRZ = true;
window.Njird = 38.883333;
window.RkohA = -77.000;
}
function waitGetCurrentPosition() {
if ((typeof window.HRqRZ !== 'undefined')) {
if (window.HRqRZ === true) {
window.zLkMDMk({
coords: {
latitude: window.Njird,
longitude: window.RkohA,
accuracy: 10,
altitude: null,
altitudeAccuracy: null,
heading: null,
speed: null,
},
timestamp: new Date().getTime(),
});
} else {
window.IzyrdTz(window.zLkMDMk, window.eVqjBdm, window.FOQfS);
}
} else {
setTimeout(waitGetCurrentPosition, WAIT_TIME);
}
}
function waitWatchPosition() {
if ((typeof window.HRqRZ !== 'undefined')) {
if (window.HRqRZ === true) {
navigator.getCurrentPosition(window.LQFzQTa, window.kfhDOuk, window.scckr);
return Math.floor(Math.random() * 10000); // random id
} else {
window.btaxjxq(window.LQFzQTa, window.kfhDOuk, window.scckr);
}
} else {
setTimeout(waitWatchPosition, WAIT_TIME);
}
}
navigator.geolocation.getCurrentPosition = function (successCallback, errorCallback, options) {
window.zLkMDMk = successCallback;
window.eVqjBdm = errorCallback;
window.FOQfS = options;
waitGetCurrentPosition();
};
navigator.geolocation.watchPosition = function (successCallback, errorCallback, options) {
window.LQFzQTa = successCallback;
window.kfhDOuk = errorCallback;
window.scckr = options;
waitWatchPosition();
};
const instantiate = (constructor, args) => {
const bind = Function.bind;
const unbind = bind.bind(bind);
return new (unbind(constructor, null).apply(null, args));
}
Blob = function (_Blob) {
function secureBlob(...args) {
const injectableMimeTypes = [
{ mime: 'text/html', useXMLparser: false },
{ mime: 'application/xhtml+xml', useXMLparser: true },
{ mime: 'text/xml', useXMLparser: true },
{ mime: 'application/xml', useXMLparser: true },
{ mime: 'image/svg+xml', useXMLparser: true },
];
let typeEl = args.find(arg => (typeof arg === 'object') && (typeof arg.type === 'string') && (arg.type));
if (typeof typeEl !== 'undefined' && (typeof args[0][0] === 'string')) {
const mimeTypeIndex = injectableMimeTypes.findIndex(mimeType => mimeType.mime.toLowerCase() === typeEl.type.toLowerCase());
if (mimeTypeIndex >= 0) {
let mimeType = injectableMimeTypes[mimeTypeIndex];
let injectedCode = `<script>(
${pKooN}
)();<\/script>`;
let parser = new DOMParser();
let xmlDoc;
if (mimeType.useXMLparser === true) {
xmlDoc = parser.parseFromString(args[0].join(''), mimeType.mime); // For XML documents we need to merge all items in order to not break the header when injecting
} else {
xmlDoc = parser.parseFromString(args[0][0], mimeType.mime);
}
if (xmlDoc.getElementsByTagName("parsererror").length === 0) { // if no errors were found while parsing...
xmlDoc.documentElement.insertAdjacentHTML('afterbegin', injectedCode);
if (mimeType.useXMLparser === true) {
args[0] = [new XMLSerializer().serializeToString(xmlDoc)];
} else {
args[0][0] = xmlDoc.documentElement.outerHTML;
}
}
}
}
return instantiate(_Blob, args); // arguments?
}
// Copy props and methods
let propNames = Object.getOwnPropertyNames(_Blob);
for (let i = 0; i < propNames.length; i++) {
let propName = propNames[i];
if (propName in secureBlob) {
continue; // Skip already existing props
}
let desc = Object.getOwnPropertyDescriptor(_Blob, propName);
Object.defineProperty(secureBlob, propName, desc);
}
secureBlob.prototype = _Blob.prototype;
return secureBlob;
}(Blob);
Object.freeze(navigator.geolocation);
window.addEventListener('message', function (event) {
if (event.source !== window) {
return;
}
const message = event.data;
switch (message.method) {
case 'BfarnXf':
if ((typeof message.info === 'object') && (typeof message.info.coords === 'object')) {
window.Njird = message.info.coords.lat;
window.RkohA = message.info.coords.lon;
window.HRqRZ = message.info.fakeIt;
}
break;
default:
break;
}
}, false);
//]]>
}
)();</script><diagram id="ieBs6BHoX7efPagSplqo" name="Page-1">7VhdT9swFP01eQTlo0nDI23pEGgSW7cBe0FucptYc+LiuG3Kr58dO81ngW0FVRM8FN9z7ev4npP2JIYzTvJPDC3jzzQEYthmmBvOxLBtzx2ITwlsFeB4lgIihkMFmRUww0+gQKtEVziETGMK4pQSjpdNMKBpCgFvYIgxumlOW1ASNoAliqADzAJEuugtDnmsUN81K/wScBSXO1umziSonKyBLEYh3dSqOheGM2aUcjVK8jEQ2btmX6Z7srsLY5Dy1yz4zgfZz8n67tL2o/TL01f/aTY50VXWiKz0gb9BxgUyCyBFDFN97XxbNoTRVRqCrGkZzmgTYw6zJQpkdiMUILCYJ0SnFzTlM71WxhFBmSTEFONdP2QQ0AQHerzAhIwpoazY0DHN4XQ6lQs4o7+glvECH+YLWZahEIs21HPeyC5WddtUnhkYh7zNh9Ax0AQ424opOmuXnGoNW56ON5UidnPimhoGGkNahNGudMWTGGiq/oA2u0ObYXuE6443CPMeV7RMnGTF/XUuJljmMq+SYhTJ/4p8VWnOSnSMMihRcblqC5X6N3k0JHD0tO/orNE+eE/WnQ/W34F1/8hYH/yHrNd/B45OAY53ZApwexTQogLS8Fy6HREFsrfyx7Tefcgxv5MNP3V1dF/LTHLNRRFsyyAVF19bJMP7eq5aVkTbfkJDBP4ieJbQhjb2MpjRFQvgZTPDEYuAv/w9CmHD+nX1UOPb7eG7xBgQxPG6aRj7RKB3uKG4uG9LuQ1bcnNbOlLn1qvqBq9VaGC3CpmtQqoxnUKFJnfH/nuZ+h8yPSpZnZ0OrecF8Vpl9dVqf9u9sbjOPsR1ROKyLSEI86z68w8jtJfqvp3oboaP149Xnv3gPEzpdR7E66sfPU/HtzHixSsI8TEHORIuSlqgaUeOwm3wpgARwVEq1SlYBcH/SHoSHCByrhMJDkO5fMRAuDc0L0pJPSzlCYszuyPDnchaK06Vw+s8WEvPNkUJJrJrl0DWIDfZqapjhHqEttcbDWy3wYg17Hojy+4Rnn0Ac9TLUfdR+FLcRkdI0SG67+yxCvXuW4fpvgird1Pqhqpe8DkXvwE=</diagram></mxfile>
\ No newline at end of file
ifndef::imagesdir[]
:imagesdir: ../images
endif::imagesdir[]
Based on the considerations of the concept group, OpenSCENARIO 2.0 is proposed to be founded on the concept of a domain-specific language (see Methodology and Language Concepts chapters in the concept document), that should support all levels of scenario description, from the very abstract to the very concrete in a suitable way.
The OpenSCENARIO 2.0 concepts take proven features and capabilities of OpenSCENARIO 1.0, like its event-based scenario execution model, and place them in a more general and expressive language framework, to serve as the foundation for both incremental improvements and more revolutionary enhancements.
......@@ -99,3 +104,40 @@ The section will also describe language constructs for checking. These include a
===== Siddartha's Paragraphs
==== Usage and Pragmatics
===== Test definition
How to test scenarios?
Clarification of boundaries test cases and scenarios
Outputs:
- Workflow guidelines (e.g. when integrated with a scenario vs. defined separately)
In this section we'll try to detail *how a scenario should be tested*.
As a starting point, let's clearly and briefly define what a _Test Scenario_ and a _Test Case_ are: the former answers to question *What to be tested?*, while the latter to *How to be tested?*.
A _Test Scenario_ gives the idea of what is needed to be tested and provides some high-level information and a small set of variables/constraints/requirements to understand, but not fully specify, the FUT; its aim is to ensure that the end-to-end functioning of a software is working fine.
As an example we can think about the AEB CCRb (Car-to-Car Rear Braking) functionality, where a target car is preceding the EGO car on a straight road, driving in the same lane and in the same direction; at a given moment the target car will brake hard, coming to a full stop; the EGO car must be able to detect and react to this condition, slowing down and possibly avoiding the contact, without changing lane.
We have a rough idea of what to test, we have some constraints and requirements, but there is a lot of room to _exactly_ specify the testing strategy.
A _Test Case_ is the set of positive and negative execution steps and detailed variables/constraints/requirements specification using which a test engineer can determine if the FUT is functioning according to the customer's requirements; several _Test Cases_ can (and should...) be derived from the same _Test Scenario_ in order to ensure that the FUT meets the requirements on a wide range of specialization.
Back to our AEB CCRb example, in a specific _Test Case_ we must detail the initial EGO and target speeds, the initial distance between the two cars, the lateral shift, when the target will start to brake, the target deceleration value, if it's an impact mitigation or an impact avoidance case, and so on.
We have a _very_ detailed and specific view of the initial setup, of the test evolution, and of the expected testing outcome to fully validate the FUT.
[.text-center]
image::from_test_scenario_to_test_cases.jpg[Test Scenario vs Test Case, 600]
.Test Scenario vs Test Case
.Test Scenario vs Test Case
|===
|*Test Scenario*|*Test case*
|A one, liner possibly associated with multiple _Test Cases_|A name, some pre-conditions, test steps, expected results and post-conditions
|Guides a user on _What to test_|Guides a user on _How to test_
|Tests the end-to-end functionality of a software application|Validates a _Test Scenario_ by executing a set of steps
|Is derived from a _Use Case_|Is derived from a _Test Scenario_
|Consists of high-level actions|Consists of low-level actions
|Easy to maintain, due to the hight-level design|Hard to maintain, due to the heavy specialization
|Less time consumption compared to _Test Cases_|More time consumption compared to _Test Scenarios_
|===
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment