├── .gitignore
├── Automation
├── CI & CD
│ ├── Jenkins jobs.md
│ └── Jenkins plugins.md
├── General
│ ├── General.md
│ ├── Naming convention.md
│ ├── Writing shell scripts.md
│ └── qama and qawa.md
├── Locators
│ ├── CSS.md
│ ├── General.md
│ ├── Strategies (Python).md
│ └── XPath.md
├── Mobile
│ ├── Appium
│ │ ├── Appium setup.md
│ │ ├── Locator naming differences.md
│ │ ├── Troubleshooting Appium.md
│ │ └── iOS setup.md
│ └── Automated monkey testing.md
├── Python
│ ├── Pytest tips & tricks.md
│ ├── Using pyenv.md
│ └── Virtual Environment.md
├── Way of working
│ ├── Pull requests.md
│ ├── Test automation.md
│ ├── Version control.md
│ └── Working on a project.md
└── Web
│ ├── Get started with Playwright for Python.md
│ └── Puppeteer.md
├── Basics
├── Attending conferences.md
├── Impostor syndrome.md
├── QA glossary.md
├── Software development methodologies.md
├── Stress and problems.md
├── Taking care of yourself.md
├── Task management.md
├── Test documentation.md
├── Testing in general.md
├── What is your job all about - TAE.md
├── What is your job all about.md
├── Working on projects.md
├── Writing bug reports.md
└── Writing test cases.md
├── Knowledge
├── API - Basics.md
├── Book summary - Fifty Quick Ideas To Improve Your Tests.md
├── Common design implementation mistakes.md
├── Estimations in QA.md
├── Infrastructure
│ ├── Authentication and Authorization.md
│ ├── Cloud Infrastructure.md
│ ├── Continuous Deployment and Delivery.md
│ ├── Deployment Environment.md
│ ├── Docker and Kubernetes.md
│ ├── Frontend and Backend.md
│ └── Introduction.md
├── Literature and resources.md
├── UI & UX - Android.md
├── UI & UX - Basics.md
├── UI & UX - Web - Part 1.md
├── UI & UX - Web - Part 2.md
└── UI & UX - iOS.md
├── README.md
├── Testing
├── Heuristics in testing.md
├── Testing - Design Review.md
├── Testing - Exploratory Testing.md
├── Testing - Forms.md
├── Testing - Mobile.md
├── Testing - Prerelease.md
├── Testing - Testing session.md
├── Testing - Various.md
├── Testing - Web.md
└── Testing - WordPress.md
├── Tools
├── General tool list.md
├── Mobile security testing tools.md
├── Test Recorders.md
├── Using ADB.md
├── Using Android Profiler.md
├── Using Android Vitals.md
├── Using Appbot.md
├── Using BrowserStack.md
├── Using Chrome Dev Tools.md
├── Using Firebase.md
├── Using JIRA and Confluence.md
├── Using Newman.md
├── Using Postman.md
├── Using Proxyman.md
├── Using Slack.md
├── Using Terminal.md
├── Using Testrail.md
├── Using TryOutApps.md
├── Using Xcode - Location mocking.md
├── Using Xcode Instruments.md
└── Version Control Systems
│ ├── Access token and SSH keys.md
│ ├── Code management.md
│ ├── Using Git - Advanced.md
│ ├── Using Git - Basics.md
│ └── Using Git - Resolving conflicts.md
├── img
├── 0_EEhV9BlXgsTFnBW8 (1).gif
├── 0_EEhV9BlXgsTFnBW8.gif
├── 0_ISI_huTLMe899JVq.gif
├── 0_bYF8loGdnpHklSKS.gif
├── 1_battery.png
├── 2_battery.png
├── 3_battery.png
├── 4_battery.png
├── 5_battery.png
├── Activity_Indicator.png
├── Android_Studio-Run_and_Profile.png
├── Android_Studio-add_no_activity.png
├── Android_Studio-configure_your_project.png
├── Android_Studio-connected_device.png
├── Android_Studio-start_new_project.png
├── Android_studio-Profiler.png
├── Backdrop.png
├── Banner.png
├── Bottom_Bar.png
├── Bottom_Navigation.png
├── Breadcrumb_navigation.png
├── Builder.png
├── CSS-Accordion-Menu-with-Tooltip.gif
├── CTA_button.png
├── Cards.png
├── Chips.png
├── Collections-1.png
├── Comparison_Table.png
├── Console.png
├── Cookies.png
├── Date_Picker.png
├── Dialog.png
├── Divider.png
├── Exploratory_Testing_QR_code_scanner_steps.png
├── Fixed_Menu.gif
├── Fixed_Sidebar.gif
├── Floating_Action_Button.png
├── Full_Page_Tabs.gif
├── Fullscreen_Navigation.gif
├── Fullscreen_Search.gif
├── Heuristics_Cheat_Sheet.png
├── Hover_Tabs.gif
├── Image_List.png
├── Image_Overlay_Title.gif
├── Installbutton.jpg
├── JIRA_test_plan.jpg
├── Lists.png
├── Loader.gif
├── M1_iphone_Apps.png
├── Modal_Box.gif
├── Modal_Images.gif
├── Navigation-2.png
├── Navigation_Bar.png
├── Navigation_Bar_Title.png
├── OWASP_ZAP_2-7-0.png
├── Off-Canvas Menu.gif
├── Offline_mode.png
├── Overlay_Effect.gif
├── Page_Control.png
├── Pagination.png
├── Popover.png
├── Popup-onclick.gif
├── Postman_2x_tests.png
├── Postman_expected_result.png
├── Postman_first_20_pokemons.png
├── Postman_flow.png
├── Postman_status200.png
├── Postman_test_code.png
├── Postman_test_fail.png
├── Postman_test_request.png
├── Postman_tests_success.png
├── Postman_variable.png
├── Postman_variable_code.png
├── Progress_Bar.gif
├── Proxyman_brakepoint.png
├── Proxyman_brakepoint_rules.png
├── Proxyman_charts.png
├── Proxyman_crtificate.png
├── Proxyman_example_chart.png
├── Proxyman_rule.png
├── Proxyman_rule_draft.png
├── Proxyman_value_89.png
├── QARK_apk_path.png
├── Range_Sliders.gif
├── Response_Box-1.png
├── Scope_Bar.png
├── Scroll_Indicator.gif
├── Search_Bar_iOS.png
├── Search_Bar_web.png
├── Section_Counter.png
├── Side_Navigation.gif
├── Slider.png
├── Slideshow_Carousel.gif
├── Smooth_Scroll.gif
├── Snackbar_Toast.gif
├── Snackbars.png
├── Star_Rating.png
├── Status_Bar.png
├── Stepper.png
├── Sticky_Navbar.gif
├── Sticky_Social_Bar.gif
├── Style.png
├── Switch.png
├── Tab_Bar.png
├── Tab_Headers.gif
├── Tabs.gif
├── Tabs.png
├── Testing_Prereleases_Report.png
├── Testing_Prereleases_TestRail.png
├── Testrail_test_case.jpg
├── Testrail_test_report.jpg
├── Toggle_Switch.gif
├── Toolbar.png
├── Tooltips.gif
├── Tooltips.png
├── Top_Bar.png
├── Top_Navigation.gif
├── UI-design-elements.png
├── Vertical_Tabs.gif
├── WS-manage-environment65.png
├── Xray_test_case.jpg
├── Xray_test_report.jpg
├── adding_icon.png
├── adding_new_content.png
├── agile-quadrant.png
├── android_proxy_setup.gif
├── android_studio_sdk.png
├── appbot-reviews.png
├── appbot-slack-review.png
├── appmon.png
├── artifact1.png
├── artifact2.png
├── artifact3.png
├── artifact4.png
├── artifact5.png
├── artifact6.png
├── artifact7.png
├── block.png
├── book-business-rule.png
├── book-cases.png
├── book-idea-1.png
├── book-idea-2.png
├── book-idea-3.png
├── book-idea-4.png
├── book-idea-5.png
├── book-idea-6.png
├── book-input-output.png
├── book-intro.png
├── browser-list.png
├── bug_example.png
├── bva.png
├── case.jpg
├── cd.jpg
├── charles-set-up-host.png
├── collection-runner.png
├── common_1.png
├── common_2.png
├── common_3.png
├── common_4.png
├── common_5.png
├── common_6.png
├── common_7.png
├── common_8.png
├── continuum.jpg
├── design_review_in_excel.png
├── designreview_15.png
├── designreview_16.png
├── designreview_17.png
├── ed.jpg
├── editing_content.png
├── eightshift_form.png
├── exp-vs-for.png
├── file_update.png
├── firefox_offline.png
├── git_branches.jpg
├── git_choose_branches_PR.png
├── git_conflicts_conflict.png
├── git_conflicts_resolve_conflict_1.png
├── git_conflicts_resolve_conflict_2.png
├── git_conflicts_resolve_conflict_3.png
├── git_conflicts_resolve_conflict_4.png
├── git_conflicts_resolved.png
├── git_pull_request.png
├── git_workflow.jpg
├── git_workflow_example.png
├── googleRequest.png
├── gutenberg.png
├── header-2.png
├── html.png
├── iOS_QR_Camera.jpg
├── inspectElement.png
├── inspector.png
├── install_apk.jpg
├── instruments_choose_profiling_template.png
├── instruments_detail_pane.png
├── instruments_inspector_pane_navigation_bar.png
├── instruments_profiling_dialog_target.png
├── instruments_profiling_dialog_template_choice.png
├── instruments_trace_document.png
├── instruments_trace_document_timeline_pane.png
├── instruments_trace_document_toolbar.png
├── ios_proxy_setup.gif
├── jenkins_build_history.png
├── jenkins_build_now.png
├── jenkins_console_output.png
├── jenkins_plugins_html_publisher.png
├── jenkins_scan_multibranch_pipeline.png
├── jira_article_1.png
├── jira_article_2.png
├── jira_article_3.png
├── jira_article_4.png
├── jira_article_5.png
├── jira_article_6.png
├── jira_article_7.png
├── jira_article_8.png
├── jira_article_9.png
├── jmeter-example.png
├── lighthouse-diagnostics.png
├── lighthouse-report.png
├── lighthouse.png
├── live-app-load.png
├── live-app.png
├── loading.png
├── location1.png
├── location10.png
├── location11.png
├── location15.png
├── location1a.png
├── location2.png
├── location3.png
├── location4.png
├── location4a.png
├── location5.png
├── location5a.png
├── location6.jpeg
├── location6a.jpeg
├── location7.png
├── location8.png
├── location9.png
├── locators_android.png
├── login.png
├── mobile-browser-list.png
├── network-headers.png
├── network-request.png
├── network.png
├── objection.png
├── products.png
├── project-methodologies.jpg
├── proxyman1.png
├── report_path_qark.png
├── requestStatus.png
├── responsive.png
├── root-cause.png
├── scrum-ceremonies.jpg
├── scrum-sprint.jpg
├── scrum-team.png
├── scrum-vs-kanban.png
├── sections.jpg
├── selenium_locators_css_devtools_1.png
├── selenium_locators_css_devtools_2.png
├── selenium_locators_xpath_devtools_1.png
├── selenium_locators_xpath_devtools_2.png
├── some_commands.png
├── st-qc-qa.png
├── suites.jpg
├── summary.png
├── t-shaped.png
├── test-pyramid.png
├── test_recorders1.png
├── test_recorders2.png
├── test_recorders3.png
├── test_recorders4.png
├── test_recorders5.png
├── tr1.png
├── tr2.png
├── tr3.png
├── troubleshooting_appium_appium_doctor.png
├── virtual_environment_active.png
├── virtual_environment_create_project.png
├── virtual_environment_requirements.png
├── virtual_environment_structure.png
├── web-design-vocab-infographic.png
├── web-testing.png
├── wp_dashboard.png
├── wp_login.png
├── wp_multisite.png
├── xcode_instruments_menu.png
├── zephyr_call_to_test.jpeg
├── zephyr_test_case_details.png
├── zephyr_test_cycles.jpeg
├── zephyr_test_library.png
├── zephyr_test_reports.png
├── zephyr_test_script.png
├── zephyr_traceability.png
└── zephyr_version_control.png
└── intro.slim
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io/api/macos
2 | # Edit at https://www.gitignore.io/?templates=macos
3 |
4 | ### macOS ###
5 | # General
6 | .DS_Store
7 | .AppleDouble
8 | .LSOverride
9 |
10 | # Icon must end with two \r
11 | Icon
12 |
13 | # Thumbnails
14 | ._*
15 |
16 | # Files that might appear in the root of a volume
17 | .DocumentRevisions-V100
18 | .fseventsd
19 | .Spotlight-V100
20 | .TemporaryItems
21 | .Trashes
22 | .VolumeIcon.icns
23 | .com.apple.timemachine.donotpresent
24 |
25 | # Directories potentially created on remote AFP share
26 | .AppleDB
27 | .AppleDesktop
28 | Network Trash Folder
29 | Temporary Items
30 | .apdisk
31 |
32 | # End of https://www.gitignore.io/api/macos
--------------------------------------------------------------------------------
/Automation/General/qama and qawa.md:
--------------------------------------------------------------------------------
1 | > All code is guilty, until proven innocent.
2 |
3 | `qama` and `qawa` are our **template projects** for test automation.
4 |
5 | The idea behind them is to help you quickly start writing maintainable and easy to understand UI tests.
6 | While **qama** is designed to work primarily with mobile, **qawa** focuses on web projects.
7 |
8 |
9 | ## Project structure
10 |
11 | Both projects are structured using the _page object model_.
12 |
13 | In short, that means that:
14 |
15 | - Locators are placed in a page class.
16 | - Tests are placed in a test class.
17 |
18 | More on page object model:
19 | - [Martin Fowler - PageObject](https://martinfowler.com/bliki/PageObject.html)
20 | - [Selenium docs - Page object Models](https://www.selenium.dev/documentation/test_practices/encouraged/page_object_models)
21 |
22 |
23 | ## qama
24 |
25 | `qama` stands for `QA Mobile Automation.`
26 | It also happens to be a [sword](https://en.wikipedia.org/wiki/Qama). :)
27 |
28 | It is based on the [pytest framework](https://docs.pytest.org) and [Appium](https://appium.io).
29 | See [README](https://github.com/infinum/qama#readme) for more details and setup instructions.
30 |
31 |
32 | ## qawa
33 |
34 | `qawa` stands for `QA Web Automation.`
35 |
36 | It is based on the [pytest framework](https://docs.pytest.org) and [Selenium](https://www.selenium.dev).
37 | See [README](https://github.com/infinum/qawa#readme) for more details and setup instructions.
38 |
--------------------------------------------------------------------------------
/Automation/Locators/Strategies (Python).md:
--------------------------------------------------------------------------------
1 | > The bitterness of poor quality remains long after the sweetness of low price is forgotten. - Benjamin Franklin
2 |
3 |
4 | ## What are WebElements?
5 |
6 | A **WebElement** is an element such as a button, checkbox, input field, or any kind of element present on the webpage.
7 |
8 | To interact with a WebElement, you first need to locate that element on the page. Selenium WebDriver API offers, among other functionalities, built-in methods for finding WebElements using various properties/locators: *ID*, *XPath*, *CSS selector*, *Name*, *Class name*, *Tag name*, *Link text*, and *Partial link text*.
9 |
10 | ## Which locator to use?
11 |
12 | You want to use a unique locator for every element. Most of the time that will be the **ID** of an element.
13 | In case the ID is not present, try Name, XPath, or CSS selector. Anyway, make sure that the locator is unique and that you are getting the correct one.
14 |
15 | ## Locator strategies
16 | Based on the available locators, the following methods are available:
17 |
18 | Methods that return a **single** element, the first one found:
19 |
20 | - `find_element_by_id`
21 | - `find_element_by_name`
22 | - `find_element_by_xpath`
23 | - `find_element_by_link_text`
24 | - `find_element_by_partial_link_text`
25 | - `find_element_by_tag_name`
26 | - `find_element_by_class_name`
27 | - `find_element_by_css_selector`
28 |
29 | Methods that return all (a **list** of) elements matching the property:
30 |
31 | - `find_elements_by_name`
32 | - `find_elements_by_xpath`
33 | - `find_elements_by_link_text`
34 | - `find_elements_by_partial_link_text`
35 | - `find_elements_by_tag_name`
36 | - `find_elements_by_class_name`
37 | - `find_elements_by_css_selector`
38 |
39 |
40 | ### NoSuchElementException
41 | More often than not, you will come across `NoSuchElementException`.
42 | The exception tells you that you are trying to get an element that does not exist on the page. The element might really be missing, maybe you are using the wrong locator to get it, or maybe you simply have a typo in your code.
43 |
44 | Take another look at your code, there could be simply a character missing :)
45 |
46 |
47 | ## Additional resources
48 |
49 | For more info read the ["Locating elements" chapter](https://selenium-python.readthedocs.io/locating-elements.html) in the *Selenium with Python* document.
50 |
--------------------------------------------------------------------------------
/Automation/Mobile/Appium/Locator naming differences.md:
--------------------------------------------------------------------------------
1 | ## Naming differences
2 |
3 | There are some naming differences that add to the confusion when comparing Appium, Android, and iOS terminology. Specifically, when using `AppiumBy.ID` and `AppiumBy.ACCESSIBILITY_ID`.
4 |
5 | To help with understanding, it is useful to use Appium Inspector to visualize the differences.
6 |
7 | Appium Inspector displays two useful sections on the right-hand side, Find By and Attribute.
8 |
9 | - **Find By** shows (some) locator strategies you could use to find the selected element, and the value it returns
10 | - **Attribute** provides information on the element's properties, and their corresponding values
11 |
12 | 
13 |
14 |
15 | ### AppiumBy.ID
16 |
17 | When locating an element using **AppiumBy.ID**, Appium looks for the following atributes:
18 |
19 | - `resource-id` (Android)
20 | - `name` (iOS)
21 |
22 |
23 | ### AppiumBy.ACCESSIBILITY_ID
24 |
25 | When locating an element using **AppiumBy.ACCESSIBILITY_ID**, Appium looks for the following attributes:
26 |
27 | - `content-desc` (Android)
28 | - `name` (iOS)
29 |
30 |
31 | ### Appium Inspector
32 |
33 | When inspecting the app with Appium Inspector you see the available strategies shown in the **Find By** section, and element attributes in the **Attribute** section.
34 |
35 | **Find By**
36 |
37 | For Android
38 |
39 | - `id` shows the value of `resource-id`
40 | - `accessibility id` shows the value of `content-desc`
41 |
42 | For iOS
43 |
44 | - `accessibility id` shows the value of `name`
45 |
46 |
47 | **Attribute**
48 |
49 | For Android
50 |
51 | - `resource-id` shows the value of `Resource ID`
52 | - `content-desc` shows the value of `ContentDescription`
53 |
54 | For iOS
55 |
56 | - `name` shows the value of `accessibilityIdentifier` (or `accessibilityLabel` if `accessibilityIdentifier` is not set)
57 | - `label` shows the value of `accessibilityLabel`
58 |
59 |
60 | ### Table: Locator strategies in Appium Inspector
61 |
62 | The table below shows different locator strategies used in Appium, and corresponding attributes shown in Appium Inspector.
63 |
64 | | Appium Inspector | Android | iOS |
65 | |:-------------------|:---------------|:-----|
66 | | id | resource-id | name |
67 | | accessibility id | content-desc | name |
68 |
69 |
70 | ### Table: Element attributes in Appium Inspector
71 |
72 | The table below shows different element attributes used by Appium, and corresponding properties that are set on mobile platforms.
73 |
74 | | Appium Inspector | Android | iOS |
75 | |:-------------------|:-------------------|:---------------------------------------------|
76 | | resource-id | Resource ID | |
77 | | content-desc | ContentDescription | |
78 | | name | | accessibilityLabel / accessibilityIdentifier |
79 | | label | | accessibilityLabel |
80 |
81 |
82 | **Note**:
83 |
84 | - [accessibilityLabel](https://developer.apple.com/documentation/objectivec/nsobject/1615181-accessibilitylabel) is used by screen readers and should be written in a user-friendly manner
85 | - [accessibilityIdentifier](https://developer.apple.com/documentation/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier) should use a different format to avoid confusion and retain uniqueness
86 |
87 |
88 | ### Additional resources
89 |
90 | Check [Mobile - element IDs](https://infinum.com/handbook/devproc/test-automation/mobile-element-ids) for info on how to set the element ID.
91 |
--------------------------------------------------------------------------------
/Automation/Mobile/Automated monkey testing.md:
--------------------------------------------------------------------------------
1 | > *What does a logger say before he cuts down a tree? Let the chimps fall where they may.*
2 |
3 | ## Automated monkey testing
4 | Monkey testing is a type of testing where you send random inputs to application while checking behavior, or seeing whether the application or system will crash.
5 |
6 | Here's how to get it up and running on any Android device:
7 |
8 | 1. Install [ADB] (https://developer.android.com/studio/command-line/adb?authuser=1) (Android Debug Bridge)
9 |
10 | 2. Install an application you want to Monkey test on any Android device
11 |
12 | 3. Connect the Android device with your Mac and click "Trust"
13 |
14 | 3. Open terminal and run `adb devices` to confirm the device is properly connected (this command should list all connected devices)
15 |
16 | 4. If you can see the connected device, run `adb shell pm list packages -f > packages.txt` to create "packages.txt" file with all app packages on your Android device.
17 |
18 | 5. Locate the "packages.txt" file in your home directory and open it
19 |
20 | 6. Search the name of the application you want to test (e.g. "QA Adventure")
21 |
22 | 7. If the Facebook" application is installed on your device, you'll probably see something similar to this
23 | > package:/data/app/co.infinum.qaadventure.staging-1/base.apk=co.infinum.qaadventure.staging
24 |
25 | 8. Copy the string that starts with the "co", this is the package name we need:
26 | > co.infinum.qaadventure.staging
27 |
28 | 9. Open terminal again and run `adb shell monkey -p your.package.name -v 5000` or, in my case `adb shell monkey -p co.infinum.qaadventure.staging -v 5000`
29 |
30 | 10. This will send 5000 random events to the QA Adventure application.
31 |
32 | Follow [this link] (https://developer.android.com/studio/test/monkey.html) if you need more information.
33 |
--------------------------------------------------------------------------------
/Automation/Python/Pytest tips & tricks.md:
--------------------------------------------------------------------------------
1 | ## What is pytest?
2 |
3 | Pytest is a testing framework for Python. For more info, check the [documentation](https://pytest.org).
4 |
5 |
6 | ### Conftest
7 |
8 | `conftest.py` is a file in which you can set up your test configuration. The file should primarily consist of fixtures which are automatically detected and executed.
9 |
10 |
11 | You can have multiple `conftest` files in your project. For example, you can have one `conftest` in the project root where you want to set up logic for the entire project. This one might be useful for the overall configuration, like setting up driver(s). And then you can also add an additional `conftest` file into your tests directory. In `tests/conftest.py` you could have fixtures that are used only on tests. Note that all tests will use those fixtures.
12 |
13 |
14 | You can even add another `conftest` in other test subdirectories. For example, directory `test_a` could have its own conftest `tests/test_a/conftest.py`.
15 |
16 |
17 | The structure might look something like this:
18 |
19 | ```
20 | ROOT
21 | conftest.py
22 | └── tests
23 | └── conftest.py
24 | └── test_a
25 | └── conftest.py
26 | └── test_file_a.py
27 | └── test_b
28 | └── test_file_b.py
29 | ```
30 |
31 |
32 | ### Fixtures and Hooks
33 |
34 | Fixtures are defined using the `@pytest.fixture` decorator. They ensure the setup and teardown of resources before and after tests, providing a clean and consistent testing environment.
35 | Hooks are used for customizing the behavior of the testing framework itself and they are triggered at specific points during the test execution process.
36 |
37 | Few things to have in mind when working with Fixtures and Hooks:
38 |
39 | - Fixtures are created when first requested by a test, and are destroyed based on their scope. Possible values for scope are `function` (default), `class`, `module`, `package` or `session`.
40 | - Hooks do not have scope.
41 | - Hook functions can be grouped into plugins.
42 | - You can use hooks to customize test reporting.
43 | - Fixtures cannot be called from a Hook function.
44 |
45 |
46 | ### How to use fixtures
47 |
48 | Pytest fixtures are sometimes confusing. They cannot be called directly, as you would call a function. However, they can be called in various other ways.
49 |
50 | Let's say we have a fixture named fixture_a.
51 |
52 | ```python
53 | @pytest.fixture
54 | def fixture_a():
55 | ...
56 | ```
57 |
58 | To call `fixture_a` on a class, we have to use the `@pytest.mark.usefixtures` marker.
59 |
60 | ```python
61 | @pytest.mark.usefixtures("fixture_a")
62 | class SomeClass:
63 | ...
64 | ```
65 |
66 | To call `fixture_a` on a function, you have to pass it as an argument.
67 |
68 | ```python
69 | def test_one(fixture_a):
70 | ...
71 | ```
72 |
73 |
74 | ### Autouse
75 |
76 | Let's say there is some code that you want to run before or after every test, but you do not want to call it every time. `autouse` option comes in handy. By setting the `autouse` parameter in a fixture to `True`, it is called automatically.
77 |
78 |
79 | ```python
80 | import pytest
81 |
82 | @pytest.fixture(scope="function", autouse=True)
83 | def fixture_a():
84 | """Executed automatically before every test."""
85 | # Some code
86 |
87 |
88 | @pytest.fixture(scope="class", autouse=True)
89 | def fixture_b(driver):
90 | """Executed automatically after every class."""
91 | yield driver
92 | # Some code
93 | ```
94 |
95 | Check the docs on [autouse](https://docs.pytest.org/fixture.html#autouse-fixtures-fixtures-you-don-t-have-to-request) for more details.
96 |
97 |
98 | ### Soft asserts
99 |
100 | If you need soft asserts in your tests, [pytest-check](https://pypi.org/project/pytest-check/) is a very useful plugin for pytest. It is easy to use and understand.
101 |
102 | Example:
103 |
104 | ```python
105 | # test_file.py
106 | import pytest_check as check
107 |
108 | def test_example():
109 | check.is_true(1 > 2)
110 |
111 | check.equal("abc", "def")
112 | ```
113 |
114 |
115 | ### Importing custom plugins
116 |
117 | On occasion you will have to, or want to, create a custom plugin. Or just extract some of the code from `conftest`. For pytest to discover the plugin, it has to be somehow specified in a `conftest` file.
118 |
119 | For example, you decided to add custom `html_report` and `slack` plugins. One way to do it is like this:
120 |
121 | ```python
122 | # conftest.py
123 | pytest_plugins = [
124 | "utilities.plugins.html_report.plugin",
125 | "utilities.plugins.slack.plugin",
126 | ]
127 | ```
128 |
--------------------------------------------------------------------------------
/Automation/Way of working/Pull requests.md:
--------------------------------------------------------------------------------
1 | ## Pull requests (PR)
2 |
3 | Guidelines on how to work with pull requests (PR).
4 |
5 | ## Preconditions
6 |
7 | Before creating a pull request, make sure:
8 |
9 | * Your code is working as expected
10 | * You have tested both positive and negative scenarios
11 | * There is no dead code or unnecessary comments
12 | * If there are docstrings / comments, they must be up-to-date
13 | * You have followed the style guide and linted the code
14 | * You have merged the base branch into the current working branch
15 | * Your commits are small and focused, split into logical sections
16 | * Commit messages should be clear, concise and meaningful
17 | * Avoid committing a bunch of unrelated changes under a single commit
18 |
19 | ## Opening a PR
20 |
21 | When creating a PR, make sure:
22 |
23 | * The PR is small and focused
24 | * Focus on a single feature or test suite
25 | * Keep configuration changes in a separate PR
26 | * The PR title is clear and concise
27 | * The PR has a short summary of changes and reasoning behind them
28 | * Relevant links to tasks should also be included
29 | * You have done a self-review
30 | * Always check your code before asking for a review
31 | * The code must work on your machine without any issues
32 | * You have merged the base branch into the current working branch
33 | * It ensures that you are working with the latest changes
34 | * It reduces the chance of a conflict
35 | * You added the appropriate reviewers
36 | * To simplify, add default reviewers for pull requests in the project settings
37 | * You selected the correct target branch
38 | * You updated the appropriate documentation
39 | * Project README, tasks, Confluence, etc.
40 |
41 | ## Feedback / PR review
42 |
43 | * Strive to review a PR within 24 hours
44 | * Carefully review the changes
45 | * In case of more complex changes, run the code locally to make sure everything works as expected
46 | * Leave clear questions and comments in the appropriate files / lines of code
47 | * If you have a lot to discuss, consider jumping into a call before leaving a bunch of comments
48 |
49 | ## Implementing feedback
50 |
51 | * Focus on updating the code discussed in the comments
52 | * Do not add additional code that was not discussed or is not needed at the moment
53 | * Leave that for another PR
54 |
55 | ## When and who merges a PR?
56 |
57 | You, the developer that opened the PR, are responsible for merging it to the target branch.
58 |
59 | You can merge the pull request when:
60 |
61 | * The agreed number of reviewers have checked and approved it
62 | * All comments and tasks have been resolved
63 | * The developer that opened a comment or a task is the one that closes it after the updates have been implemented and checked
64 |
65 |
66 | ### Additional resources
67 |
68 | * [Creating a pull request](https://infinum.com/handbook/frontend/code-quality/creating-a-pull-request)
69 | * [How to handle pull requests without making enemies](https://infinum.com/blog/write-good-pull-requests/)
70 |
--------------------------------------------------------------------------------
/Automation/Way of working/Version control.md:
--------------------------------------------------------------------------------
1 | ## Version control
2 |
3 | Regardless of whether you work as the only TAE on the project or with multiple people, there are some good practices you should follow when naming your git branches.
4 |
5 | We can divide them into:
6 |
7 | - permanent branches
8 | - temporary branches
9 |
10 |
11 | ### Permanent branches
12 |
13 | Permanent branches will most likely stay in your repository permanently.
14 |
15 | **Main** (_master_)
16 |
17 | - must always be stable
18 | - should be up-to-date
19 | - new code should only be merged after a code review
20 | - merge without PR should be disabled in repository settings
21 | - branch deletion should also be disabled, just in case :)
22 | - should not be used for experimenting with new code
23 |
24 | **Development**
25 |
26 | - can be used for checking new code
27 | - should be used for reviews
28 | - gets merged into _main_ after passing a code review
29 |
30 |
31 | ### Temporary branches
32 |
33 | Temporary branches, as the name indicates, are meant to live in the repository temporarily. Before starting work on a new feature or a test, you should check out a new branch. Once you are done with your work, and made sure everything works as expected, you can continue with merging the branch to develop/main after passing the code review.
34 |
35 |
36 | ### Branch naming
37 |
38 | While permanent branches are mostly to be the same on all projects, you will have some more freedom with naming your temporary branches. Branch names should be short yet meaningful.
39 |
40 | Often used names, or rather prefixes, are:
41 |
42 | - Bugfix
43 | - Hotfix
44 | - Feature
45 | - WIP
46 |
47 | To further make clear what is being worked on in a specific branch, you can add a unique ID to the name, as well as a hyphen, underscore, and slash. You can even add the author's name in the branch name to further distinguish who is working on which branch.
48 |
49 | Whichever method you decide on, make sure to keep using it consistently.
50 |
51 | Good branch names:
52 |
53 | `wip-4827-add-login-test`
54 |
55 | `username_wip_login_tests`
56 |
57 | `fix/typos_in_test_data`
58 |
59 |
60 | Bad branch names:
61 |
62 | `bugfix`
63 |
64 | `wip_add_test_that_checks_that_the_login_works`
65 |
66 | `itisdifficulttoreadthenameofthisbranch`
67 |
--------------------------------------------------------------------------------
/Automation/Way of working/Working on a project.md:
--------------------------------------------------------------------------------
1 | ## Working on a project
2 |
3 | When working on a project with multiple people/teams, you should agree on a _way of work_ and have it written down as soon as possible, preferably during your first days on the project.
4 |
5 | This should contain info on the test automation process in SDLC (Software Development Life Cycle), such as:
6 |
7 | - requesting and verifying the locators needed for test automation
8 | - when the tests are being run
9 | - which tests are run and on which build/environment
10 | - responsibility for checking the test report and reporting bugs
11 |
12 |
13 | ### Requesting IDs
14 |
15 | Ideally, if test automation is being done on the project, you should have most of the locators ready. If not, it is important to discuss early on who will be responsible for:
16 |
17 | - preparing the locators (how they should look like and which element to put them on)
18 | - opening tasks for developers requesting new locators
19 | - verifying the locators are put on the correct elements
20 |
21 | It will usually be the responsibility of a TAE. In case there are multiple TAEs on the project, a dedicated person should be decided on to make the process faster.
22 |
23 | A few things to consider when opening a new task:
24 |
25 | - task should be short and concise
26 | - better to open a few smaller ones than one big one
27 | - have the tasks logically structured (e.g. per screen or feature)
28 | - add a link to the design
29 |
30 | When preparing the locators, you should consider a tool that is already being used for design. In case the design is being done in Figma, you could use that one. Not to mess up the design, you should create a separate document that will contain all the screens to which you want locators to be added. Simply copy and paste the screens and using tools like an arrow and a text field, mark the element that needs a locator. Then, when opening a task for the developers, insert the link that points to the screen with marked elements.
31 |
32 | When working on locators, it would be wise to have a page with a few examples, a "standardization" of a sort. For example, you want all the buttons to be prefixed with "btn\_" or suffixed with "\_button". The same goes for all other elements like input fields, sliders, etc.
33 |
34 | Maybe the developers on the project already have an agreed way of working, so you could continue with that. The idea is to have somewhat similar-looking locators throughout the app.
35 |
36 | **NOTE:**
37 |
38 | - A "known issue" is when there are multiple child elements inside a parent element. For example, a LayoutView in Android might have multiple elements. Depending on the functionality, you will probably need a separate locator for each of those child elements. Otherwise, if a locator is put on the LayoutView, you will only get a better-looking XPath on the child elements. Think twice when considering elements that need a locator.
39 |
40 |
41 | ## Who writes test cases?
42 |
43 | Test cases are developed by person / team that is using them. If (manual) test cases are primarily used by the QA team, then writing and updating them is their responsibility.
44 |
45 | You as a TAE can and should help out in test development and maintenance. If labels are used to mark the tests, it is your responsibility to make sure that test cases are correctly labeled.
46 |
47 | TAE **should not** ask the QA team to adjust test cases so that they could be automated more easily.
48 | This could lead to QA focusing too much on writing the appropriate test for test automation, and not writing a good test that helps in testing.
49 |
50 |
51 | ## Which tests to automate?
52 |
53 | This depends on what you decide as a team, and which type of tests you are working on.
54 | If you are, for instance, working on UI test automation, you most likely will not be able to automate everything, for whatever reason.
55 |
56 | In any case, make sure that your code is readable and that the tests are stable.
57 | It is not how many tests there are, but whether are they doing the work they are supposed to do.
58 |
59 |
60 | ## Test reports
61 |
62 | One of your tasks is to often check the reports generated by test automation.
63 |
64 | If there are tests that ended in error or fail, make sure the issue is not in the framework or a mistake in the tests. If the issue is in the app, report it to the QA team for further investigation.
65 |
66 |
67 | ## Meetings
68 |
69 | TAE should attend all the meetings that other team members are attending; daily standup, sprint planning, backlog refinement, sprint review, sprint retrospective, etc.
70 | If there are additional QA syncs, TAE should be present.
71 |
72 | In some cases (if not most) you will work on regression tests and it might seem that attending meetings is a waste of time. However, think again.
73 | Your experience and insights will definitely be valuable to the team. Besides, hearing about what is being developed right now will help you prepare for the upcoming test automation work.
74 |
--------------------------------------------------------------------------------
/Automation/Web/Get started with Playwright for Python.md:
--------------------------------------------------------------------------------
1 | ## What is Playwright?
2 |
3 | Playwright is a test automation tool for Web testing. It supports testing on various browsers in both headed and headless mode.
4 | You can write tests in JavaScript/TypeScript, C#, Java and Python. Depending on your language of choice, the setup slightly differs.
5 |
6 | This is a short and simple guide to quickly get started with Playwright for Python.
7 |
8 |
9 | ## Requirements
10 |
11 | * Python 3.7 or newer.
12 | * Check [Playwright troubleshooting](https://playwright.dev/python/docs/troubleshooting) for more details.
13 |
14 |
15 | ## Setup
16 |
17 | 1. Create a new PyCharm project
18 | * Create and activate a [virtual environment](https://infinum.com/handbook/qa/automation/python/virtual-environment)
19 | 2. Install [pytest-playwright](https://pypi.org/project/pytest-playwright) plugin
20 | * `pip install pytest-playwright`
21 | 3. Install browsers
22 | * `playwright install`
23 | 4. Create a test file within the current working directory or a sub-directory
24 | * File name e.g.: `test_homepage.py`
25 | * See example test below
26 | 5. Run the test
27 | * On default (headless) browser:
28 | * `python3 -m pytest test_homepage.py`
29 | * On specific (headed) browser:
30 | * `python3 -m pytest test_homepage.py --browser firefox --headed`
31 |
32 |
33 | ## Example
34 |
35 | ```python
36 | import re
37 |
38 | from playwright.sync_api import Page, expect
39 |
40 |
41 | def test_homepage(page: Page):
42 | page.goto("https://infinum.com")
43 |
44 | # Expect a title "to contain" a substring
45 | expect(page).to_have_title(re.compile("Infinum"))
46 |
47 | # Create a locator for button
48 | accept_all_button = page.get_by_role("button", name="Accept all")
49 |
50 | # Take a screenshot
51 | page.screenshot(path="screenshot.png")
52 |
53 | # Click the button
54 | accept_all_button.click()
55 |
56 | # Expect the button to be hidden
57 | expect(accept_all_button).to_be_hidden()
58 |
59 | # Take a full page screenshot (screenshot of a full scrollable page)
60 | page.screenshot(path="screenshot_full_page.png", full_page=True)
61 | ```
62 |
63 | ### Resources
64 |
65 | * [Infinum QA handbook - Virtual environment](https://infinum.com/handbook/qa/automation/python/virtual-environment)
66 | * [Playwright for Python](https://playwright.dev/python/docs/intro)
67 | * [Playwright GitHub](https://github.com/microsoft/playwright)
68 | * [pytest-playwright plugin](https://pypi.org/project/pytest-playwright)
69 | * [pytest](https://docs.pytest.org/en/7.2.x)
70 |
--------------------------------------------------------------------------------
/Automation/Web/Puppeteer.md:
--------------------------------------------------------------------------------
1 | > *Quality is free, but only to those who are willing to pay heavily for it. - DeMarco, Lister*
2 |
3 | ## What is Puppeteer?
4 |
5 | Getting down to brass tacks, Puppeteer is probably the easiest way to do some UI automation in Chrome or Chromium. It can run in either full or headless mode (without the full browser UI).
6 |
7 | ## Use cases
8 |
9 | The potential use cases are neatly summed up on their [GitHub page](https://github.com/puppeteer/puppeteer):
10 |
11 | - *Generate screenshots and PDFs of pages.*
12 | - *Crawl a SPA (Single-Page Application) and generate pre-rendered content (i.e. "SSR" (Server-Side Rendering)).*
13 | - *Automate form submission, UI testing, keyboard input, etc.*
14 | - *Create an up-to-date, automated testing environment. Run your tests directly in the latest version of Chrome using the latest JavaScript and browser features.*
15 | - *Capture a timeline trace of your site to help diagnose performance issues.*
16 | - *Test Chrome Extensions.*
17 |
18 | ### Prerequisites
19 |
20 | - Install [node.js & npm](https://nodejs.org/en/download/package-manager/#macos).
21 |
22 | ### Installing Puppeteer
23 |
24 | - Global install: `npm install -g puppeteer`
25 | - Local install: `npm install puppeteer`
26 |
27 | ### Example
28 |
29 | Let's say you want to go through a login flow on a particular web page and fetch a token from the URL at the very end.
30 |
31 | This is how quickly and easily you can do it using Puppeteer:
32 |
33 | const puppeteer = require('puppeteer');
34 |
35 | // Get data from environment variables
36 |
37 | const loginUrl = process.env.URL;
38 | const email = process.env.EMAIL;
39 | const password = process.env.PASSWORD;
40 |
41 | (async () => {
42 |
43 | // Start the browser
44 |
45 | const browser = await puppeteer.launch({ headless: true });
46 | const page = await browser.newPage();
47 |
48 | // Pass the login flow
49 |
50 | await page.goto(loginUrl, { waitUntil: 'networkidle0' });
51 | await page.type('#email', email);
52 | await page.type('#password', password);
53 | await page.click('#next');
54 | await page.waitForNavigation({ waitUntil: 'networkidle0' });
55 | const url = page.url();
56 |
57 | // TODO: Parse the URL to retrieve the token
58 |
59 | // const token = ...
60 |
61 | console.log(token);
62 |
63 | // Close the browser
64 |
65 | await browser.close();
66 |
67 | })();
68 |
69 | Just save the above to a .js file and run it with `node script.js`.
70 |
71 | ## Docs
72 |
73 | For more info on all functionalities, check out their [GitHub page](https://github.com/puppeteer/puppeteer).
74 |
--------------------------------------------------------------------------------
/Basics/Impostor syndrome.md:
--------------------------------------------------------------------------------
1 | Impostor syndrome involves **feelings of self-doubt and personal incompetence**, and believing that you are undeserving of your achievements (e.g. new job, promotion, raise, etc.). A common symptom of imposter syndrome is comparing yourself to your colleagues and thinking you’re worse at your job than they are.
2 |
3 |
4 | Impostor syndrome is often the most common when you are **going through transitions and doing new things**. The pressure to achieve and succeed combined with a lack of experience can trigger **feelings of inadequacy** in these new settings.
5 |
6 |
7 | So, whether you got a new job, changed to a new project, or changed position within the company, the impostor syndrome can sneak up on you and you can feel some of the things mentioned above.
8 |
9 |
10 | The silver lining in feeling like an imposter is that **you’re never alone**. Millions of employees all over the world feel the same way you do, so having those feelings is definitely not uncommon. Some research shows that around 70% of people experience impostor syndrome at some point in their careers.
11 |
12 | ## Imagine these three scenarios
13 | ### Scenario A
14 |
15 | You got a job at Infinum and now you have to **learn a lot of new things**, both regarding the company and your new team. You are meeting a bunch of **new people** whose names you’re probably immediately forgetting. You’re coming across some **new tools** you never used and now you have to learn them. You’re **reading a lot of documentatio**n to get to know how the company and your team work. All of this is probably happening at the same time.
16 |
17 |
18 | ### Scenario B
19 | You are new at this job and you got your first project(s). Now you are meeting even more new colleagues who you’ll be working with and, this time, you’re **meeting the clients** as well. You’re reading the project’s documentation to get familiar with it and realising that **not everything is clear to you**. You also have to get familiar with the project’s **way of working** which depends from one project to another and its group dynamic.
20 |
21 | ### Scenario C
22 | You’ve been working at Infinum for some time. You know most of your colleagues and you know how to handle multiple projects at the same time. However, it is time to **switch from one project to another**. The new project is in a completely new domain you are not familiar with. There are some new colleagues and, of course, new clients. They’re using the tools you have heard of, but never used. You’re reading the project’s documentation, but it’s not entirely clear to you.
23 |
24 | ***
25 |
26 | Every one of these three scenarios can be a **trigger for impostor syndrome**. It doesn’t mean that it will happen, but if it happens, know that it is ok and that you’re probably not the only one having those feelings.
27 |
28 | ## Can you overcome impostor syndrome?
29 | Yes, at least partially. There are some things
30 | you can do to overcome it or lessen its effect:
31 |
32 |
33 | **1. Find out about impostor syndrome and become aware of it.**
34 | This one you just did! Knowing about it and anticipating it when a specific new thing happens next time makes it easier to overcome it.
35 |
36 | **2. Share your experience and talk to your colleagues or team lead about it.** Irrational beliefs tend to become worse if they are hidden and not talked about. By sharing your experience you’ll probably (if not definitely) find a colleague who resonates with your feelings and then you may find peace in knowing that you are actually not alone.
37 |
38 | **3. Don’t be afraid to ask a lot of questions.**
39 | There are always colleagues who have strengths and knowledge in certain areas you don’t, and vice versa. Asking questions doesn’t make you less worthy, but rather creates an opportunity for you and your colleagues to learn from one another to grow and succeed in your roles.
40 |
41 | **4. Know that it’s OK not to know everything and not to know what you’re doing.**
42 | After any change, like a new job, a new position, or a new project, there's always a steep learning curve. Allow yourself to mess up at any new beginning. You are human, after all.
43 |
44 | **5. Toot your own horn.**
45 | Every accomplishment, big or small, is a reason to celebrate. And, if you’re comfortable, share the accomplishment with your colleagues.
--------------------------------------------------------------------------------
/Basics/Taking care of yourself.md:
--------------------------------------------------------------------------------
1 | > *Having a testing specialist on the team is a valuable asset, but the role of a specialist isn’t to restrict that responsibility to a single person.*
2 |
3 | ## Learn, learn, learn
4 |
5 | A software tester should be able to communicate and to learn. What better way to grasp new skills but to talk about them with specialists?
6 |
7 | You should be an expert at software testing, but to become better, you should know a bit of everything going on in the world of software development. The idea is to be as *t-shaped* as possible.
8 |
9 | 
10 |
11 | Use your educational budget to learn whatever will make you a better tester. From coding tutorials to psychology books, as long as you're growing as a person and advancing your technical understanding, you're growing as a tester.
12 |
13 | ## Do not burn out
14 |
15 | Always keep in mind that quality is not only your responsibility, it is the responsibility of the entire team. You could be doing a great job, but the project (or projects) could still be stagnating.
16 |
17 | In those cases, you could become frustrated and some of these problems might start bothering you:
18 |
19 | - Too much work on your plate.
20 | - Cannot find any bugs or contribute to the project.
21 | - Bugs are crawling from all over the place and you cannot find them in time.
22 | - There are many technical terms you do not understand.
23 | - The project has become boring.
24 | - You keep doing the same thing over and over again with little results.
25 | - The client is not happy with the finished product.
26 | - You are not happy with the people you are working with.
27 |
28 | Your motivation may decrease at times. This is normal, but a prolonged case of demotivation will definitely impact your work and satisfaction.
29 |
30 | Please keep in mind that all of the aforementioned problems (and others) can be addressed by your team lead or the HR department. The imporant thing is to **speak up before you burn out**.
31 |
--------------------------------------------------------------------------------
/Basics/Task management.md:
--------------------------------------------------------------------------------
1 | > *I have not failed. I've just found 10.000 ways that won't work.*
2 |
3 | ## Tasks? Backlog?
4 |
5 | When you look at a project from the perspective of a project management tool, a project is nothing but a collection of tasks.
6 | How these tasks move about is crucial to your work.
7 |
8 | Generally, each project has a backlog. A backlog is a collection of everything that should be done. The backlog should always be prioritized, i.e. ranked from most to least important.
9 |
10 | ## Task management on Productive
11 |
12 | Once a task is pulled from the Backlog into the Shortlist, it means it is next in line to be worked on:
13 |
14 | **Backlog -> Shortlist**
15 |
16 | Once the dev actually starts coding it, he/she will transfer the task into the Current list:
17 |
18 | **Shortlist -> Current**
19 |
20 | A task ends up in the QA task list once the implementation has been completed and the developer has tested the feature without finding any obvious issues:
21 |
22 | **Current -> QA**
23 |
24 | If the task is in the QA list but still assigned to the developer, it means he/she is yet to deploy a new build or push the changes to a test environment. Once the task is assigned to you, it is time for testing.
25 |
26 | If no bugs are found QA closes the task (if the client is not doing testing).
27 |
28 | **QA -> UAT** (if the client is doing testing)
29 |
30 | If any bugs are found, the path is reversed:
31 |
32 | **QA -> Shortlist**
33 |
34 | If the task had only minor issues associated with it, you can close it and open new bugs in the Backlog.
35 |
36 | The developer will assign the task back to QA once he establishes that an issue has been fixed:
37 |
38 | **Shortlist -> Current -> QA**
39 |
40 | This back-and-forth process may take multiple iterations until the QA team closes it or deems the feature ready for user acceptance testing (UAT), which is usually done by the client. If client-side testing results in any additional issues, the process starts all over again:
41 |
42 | **UAT -> Shortlist -> Current -> QA -> UAT**
43 |
44 | You should strive to have as few as possible tasks returned from UAT. This means you have missed something. It's expected and normal that there will be issues you did not manage to catch, but you should do whatever you can to keep it at a minimum.
45 |
46 | If you find a lot of issues that originated in a task, it is perfectly fine to open separate tasks just for that issue and reference them in the original one. Once they are all done and checked, you can move the original task onwards.
47 |
48 | In general, there are two types of tasks you will deal with:
49 |
50 | - **Feature tasks:** used to implement new features.
51 | - **Bug tasks:** used to fix issues found in the implementation.
52 |
53 | Each task should only be opened for one person and one platform. E.g., if both Android and iOS are implementing the same feature, they should have separate tasks.
54 |
55 | ### Closing QA tasks
56 |
57 | If the client is not doing testing, and no bugs were found while testing a feature task or the task had only minor issues associated with it, you can close it and open new tasks in the Backlog. The same applies to bugfix tasks.
58 |
59 | When closing a QA task, you should always add the following information:
60 |
61 | - all devices/browsers on which you tested it
62 | - build/platform/environment that you used while testing
63 | - how and what you tested (you don't need to go into every single detail; a brief description with the most important information will be fine)
64 | - any other information that might be of importance (e.g. what issues you found).
65 |
66 | This way, if you or someone else ever needs to go back to that task, you will have the information about what was done and what the status of the feature/bugfix was when closing the task.
67 |
68 |
69 | ## Bug tasks - severity and priority
70 |
71 | Not all bugs are the same. You can attribute severity and priority to a bug in order to communicate to the team how important it really is and triage it appropriately.
72 |
73 | **Severity** is related to how damaging it is to the product.
74 |
75 | **Priority** is related to how soon should a fix mitigating it be deployed to production.
76 |
77 | Sometimes a bug can have low severity, but high priority. E.g. imagine uploading a wrong logo on the website.
78 |
79 | Here's one possible way of classifying them according to severity and priority:
80 |
81 | **Severity:**
82 |
83 | - Safety: Safety issue. The product creates a dangerous situation.
84 | - Blocker: Prevents function from being used, no work-around, and blocking progress in multiple screens or components.
85 | - Critical: Prevents a function from being used, no work-around being available.
86 | - Major: Prevents a function from being used, but a work-around is possible.
87 | - Normal: A problem making a function difficult to use and no special work-around is required.
88 | - Cosmetic: Small issue that does not significantly impact the product.
89 |
90 | **Priority:**
91 |
92 | - High: It should be fixed immediately.
93 | - Normal: It should be fixed in the next development iteration (sprint) or in the next version.
94 | - Low: It should be fixed at a later point.
95 |
--------------------------------------------------------------------------------
/Basics/What is your job all about - TAE.md:
--------------------------------------------------------------------------------
1 | > *Failure is not an option. It comes bundled with the software.*
2 |
3 | ## Test automation?
4 |
5 | Test automation, in a nutshell, is the practice of implementing solutions that make verifying certain requirements faster and more reliable. It is often combined with CI/CD services to make the whole code-test-deploy process more streamlined.
6 |
7 | At this point, test automation techniques cannot replace all facets of software testing, but they are certainly useful for regression testing of any sort.
8 |
9 | ## Test Automation Engineer?
10 |
11 | Since creating automated tests requires certain technical skills that are not prerequisites for most aspects of testing, we decided to create a separate role that would focus on automation itself.
12 |
13 | This does not mean that all automated tests need to be implemented by Test Automation Engineers (TAE), but we find it beneficial that there is a group of people exclusively working on developing our automation skillset, toolset, and processes.
14 |
15 | Test Automation Engineers are a part of the QA team.
16 |
17 | ## Responsibilities
18 |
19 | The main responsibilities of the TAE role are:
20 |
21 | - Developing test automation suites on various projects
22 | - Researching new technologies, libraries, and services
23 | - Working on new and existing libraries and tooling
24 | - Defining new processes and improving existing processes and technologies
25 | - Maintaining technical aspects of the QA Handbook
26 | - Technical management of testing on complex projects
27 | - Mentoring and education
28 |
--------------------------------------------------------------------------------
/Basics/What is your job all about.md:
--------------------------------------------------------------------------------
1 | > *A project is like a road trip. Some projects are simple and routine, like driving to the store in broad daylight. But most projects worth doing are more like driving a truck off-road, in the mountains, at night. Those projects need headlights. As the tester, you light the way.*
2 |
3 | ## Software testing? Quality assurance?
4 |
5 | Contrary to popular belief, your job is not about:
6 |
7 | - Pissing people off with silly bugs and edge cases.
8 | - Making fun of the company's projects.
9 | - Sitting around and tapping aimlessly without producing value.
10 |
11 | Your role is twofold:
12 |
13 | - As a **software tester**, your job is to take a good, hard, intelligent look at whatever software product you're currently working on in order to tease out the bugs, inconsistencies, ugliness and general sloppiness which is part and parcel of software development.
14 | - As a **quality assurance engineer**, your job is to look above and beyond any particular implementation in order to improve the quality of both the project at hand and the processes leading to it. This is also known as the [shift left](https://en.wikipedia.org/wiki/Shift_left_testing) approach.
15 |
16 | 
17 |
18 | Your ultimate goal is to help the company develop and deploy the best possible products within the usual constraints of time, budget, complexity, and client stubbornness.
19 |
20 | ## What are the challenges?
21 |
22 | - You will constantly **battle the unknown**. A huge part of your job is to get and share valuable information, be it client expectations, human or technical bottlenecks, technical knowledge, risks, specifications, builds, deadlines, etc.
23 | - You will constantly **battle imperfection and failure**. Software development is hard and a lot of things can go wrong at any particular moment. Stay wary of that fact and carry on.
24 | - You **will be blamed** at times. Your job is to report as many issues as possible and influence quality to the utmost of your ability. However, the burden of quality doesn't lie solely on your shoulders - quality is always a team effort, your job is to drive that effort forwards.
25 | - You will soon realize that **a tester's work is never done.** Bugs are always lurking in the shadows, but experience will help you judge when to call it a day and move on.
26 |
27 | ## You should strive to be
28 | - **Patient**
29 | - With project managers; who will sometimes push to get things done faster than you would find comfortable.
30 | - With developers; who might get sick and tired of fixing bug after bug.
31 | - With the product; which might look like a duct-taped mess for a long, long time into development.
32 | - With yourself; because your job can get repetitive and bugs have nasty faces.
33 | - **Detail-oriented**
34 | - You should see the forest for the trees and the trees for the forest: big bugs come first, but small bugs are important too.
35 | - **Constantly improving**
36 | - Lazy testers will be replaced by automated tests, it is your innate ability to empathize, adapt and learn that sets you apart from machines and allows you to spot what tests miss.
37 | - **Positive and teamspirited**
38 | - More often than not, you are the bringer of bad news, so don't make them any worse than they already are.
39 | - **Investigative**
40 | - Think of yourself as a QA analogue of Sherlock Holmes. Your job is to investigate both projects and products by constantly asking questions and getting to the bottom of things instead. "This is not my job" is not a part of the QA vernacular.
41 |
--------------------------------------------------------------------------------
/Knowledge/Infrastructure/Authentication and Authorization.md:
--------------------------------------------------------------------------------
1 | Two fundamental security concepts that often get confused are authentication and authorization.
2 |
3 | ## Authentication: Verifying Identity
4 |
5 | Authentication is the process of verifying the identity of a given user. It’s ensuring that the person logging in is actually who they say they are.
6 |
7 | There are a couple of methods of authentication, often categorized as:
8 |
9 | **Something you know**
10 | Usually a password, a PIN, or an answer to a security question. It’s the most commonly used authentication method, and in most cases, the start of the authentication process.
11 |
12 | **Something you have**
13 | Something you possess, a smart card, an authenticator application on your smartphone, or a hardware token. This is usually a device or an interface that provides a code you input alongside your password.
14 |
15 | **Something you are**
16 | Also known as biometric authentication, as it involves your own biometric factors such as a fingerprint, facial recognition, retina scans, and voice recognition.
17 |
18 | ### Multi Factor authentication
19 | An MFA is a common practice of combining two or more authentication methods to confirm the identity of a user. Most commonly applications use two factors (2FA) like your password + a One Time Password from your authenticator app, or something you know + something you have.
20 |
21 | ## Authorization: Determining Access Rights
22 | Authorization is a process of determining if an already authenticated user has access to a given object or area of a given application.
23 |
24 | For example, an authenticated user with an Administrator role is able to access the areas of the system, and may have eleveted permissions to add, modify, or remove users from the system.
25 |
26 | Whereas an authenticated user with an Employee role may only have access to a limited part of the system, designated for their work.
27 | Another example you may have encountered is the superuser (root) on your Mac. This account on your Mac has unrestricted access to the whole system, while your regular user may only have access to its own directory, and only change settings related to its own account.
28 |
29 | To use the superuser for a given account, you would typically type `sudo` ahead of the command. This prompts you to input the root user’s password (authentication) and then the command is performed with elevated permissions (authorization), accessing and modifying what a regular user may not be able to.
30 |
31 | ## Conclusion
32 |
33 | Authentication is the act of verifying who you are, and authorization is the act of verifying what you can do or access, and authentication always precedes an authorization check.
--------------------------------------------------------------------------------
/Knowledge/Infrastructure/Continuous Deployment and Delivery.md:
--------------------------------------------------------------------------------
1 | CI/CD, short for Continuous Integration and Continuous Delivery/Continuous Deployment, is all about making software development and deployment easier by automating tasks. It helps teams deliver high-quality code changes to production quickly and reliably.
2 |
3 | ## Continuous Integration
4 |
5 | Continuous Integration means frequently adding code changes to a shared place like Git, where automated tests are run. The goal is to catch any issues early on and keep the code stable. With CI, developers regularly add their changes, and each time they do, the system checks the code automatically. If there are any problems, developers get notified right away, so they can fix them quickly. This way, mistakes are smaller and easier to handle.
6 |
7 | ## Continuous Delivery
8 |
9 | Continuous Delivery is about automatically sending code changes to production or a test area in a consistent way. When code changes pass the automated tests from CI, they're sent to a testing area. There, more tests can happen or people can check it before it goes to production. This helps make sure changes are always ready to be sent out to users quickly and confidently.
10 |
11 | ## Continuous Deployment
12 |
13 | Continuous Deployment is like a step further from Continuous Delivery. It means every time code changes pass the tests from CI, they're automatically sent to production without people having to do anything. This speeds up the process even more, getting changes to users faster and helping teams get feedback quickly.
14 |
15 | ## Conclusion
16 |
17 | In summary, CI/CD is a set of practices that enable teams to automate the process of building, testing, and deploying software changes quickly and reliably. In a way, it is an agile practice translated to writing code and deployment processes.
18 |
19 | 
20 |
--------------------------------------------------------------------------------
/Knowledge/Infrastructure/Docker and Kubernetes.md:
--------------------------------------------------------------------------------
1 | Once your application, including its logic and database, is developed, the next step is to put it into production. Many of us are familiar with the frustration of the "It works on my machine" problem. This occurs when the developer's setup works perfectly, but when the application is deployed to production, something crucial is missing or does not work as expected. Additionally, ensuring that the production environment can be reproduced exactly as intended can be a headache for the infrastructure team.
2 |
3 | In the past, virtual machines were used to mitigate these issues. However, nowadays, more and more people are turning to Docker containers. These containers encapsulate all the requirements for the application environment, making deployment to production much simpler. Typically, the only requirement for deployment is having Docker installed on the production server. This makes the deployment process a breeze and ensures consistency between development and production environments.
4 |
5 | Kubernetes is a tool that helps manage a bunch of containers. These containers are like individual performers, each doing their own thing. Kubernetes makes sure they're in the right place at the right time, scales them up if there's a big crowd, and even helps if one of them needs to take a break.
6 |
7 | ## Docker
8 |
9 | Think of Docker like a special box where you can put everything your application needs to work smoothly. This includes all the code, files, and settings. Once everything is neatly packed into this box, we call it a "container."
10 | In simple terms, Docker is a tool that helps developers wrap up their applications and all their dependencies into these lightweight containers. These containers work the same way no matter where they're run, making sure everything runs consistently.
11 |
12 | Containers act like virtual environments that encapsulate all the necessary components of your application. They're self-contained packages that include your application's code, along with all the libraries, dependencies, and settings required for it to function properly. Imagine placing all these components into a special box—the container—ensuring your application remains isolated from its surroundings and operates consistently, regardless of the environment it's deployed in.
13 |
14 | Docker simplifies this process by providing tools to create and manage these containers effortlessly. Developers can package their applications into these lightweight containers, which can then be easily distributed and run on any system that supports Docker. This consistency ensures that your application behaves the same way across different environments, eliminating compatibility issues and saving time during deployment and testing.
15 |
16 | Docker is useful because it makes things a lot easier. For example, you can quickly set up the containers for testing, knowing they behave the same way everywhere. This saves time and headaches because you do not have to worry about differences between your computer and where your app is actually being used.
17 |
18 | ## Kubernetes
19 |
20 | Imagine Kubernetes like having a helpful assistant that takes care of all the behind-the-scenes things, so you can focus on making sure your application works the way it should. At its core, Kubernetes is a powerful tool that automates the deployment, scaling, and management of containerized applications. It is not just about managing individual containers; it is about orchestrating an entire ecosystem of interconnected components. Kubernetes plays a crucial role in making things easier. It helps manage all the different parts of an application, like web pages and databases, so they work well together.
21 |
22 | Here is how it works: You tell Kubernetes what you want your application to look like using simple instructions. For example, you might say, "I want three copies of my web page running at all times." Kubernetes then takes care of setting up and managing these copies for you.
23 |
24 | It also helps handle things like making sure your application is always available, even if one part of it stops working. It does this by keeping an eye on everything and fixing any problems automatically, so your users never notice a glitch.
25 |
26 | And when your application needs to handle more traffic, Kubernetes can automatically add more copies to keep up with the demand.
27 |
28 | ## Conclusion
29 |
30 | In essence, Docker helps you create portable, self-sufficient containers for your applications, while Kubernetes helps you manage and scale those containers effectively in a production environment. They are often used together with Docker for containerization and Kubernetes for orchestration.
31 |
--------------------------------------------------------------------------------
/Knowledge/Infrastructure/Frontend and Backend.md:
--------------------------------------------------------------------------------
1 | One of the most common definitions of Frontend (abbrev. FE) vs. Backend (abbrev. BE) difference is frontend is what you see and interact with, and the backend is what you can’t see, a place where all the data lives and various operations are performed.
2 |
3 | ## Frontend development
4 |
5 | Or client-side development, refers to the creation of graphical user interfaces (abbrev. GUI) of a web or mobile application. Frontend organizes, animates, and ultimately decides how data is displayed, and what needs to happen when a user interacts with it. Frontend essentially translates various raw data into human readable format, and translates interactions back to backend in machine readable format.
6 |
7 | This can be an application on a mobile device, a desktop application, or a website. While these are the most common products we test, there are plenty of other applications that utilize client-side apps these days, for example a smartwatch or even a fridge.
8 | Various frameworks and systems are utilized to do frontend development. Most prominent technology is JavaScript. Alongside HTML and CSS, JavaScript is used on more than 98% of all websites.
9 |
10 | Various frameworks were developed to improve JavaScript development, e.g. React and Angular. These became so prominent web developers often distinguish themselves as React developers, or Angular developers.
11 |
12 | Another example is WordPress, a Content Management System (CMS), originally a blogging platform, evolved with its simplicity and ease of use, today used as a platform of choice for 40%+ of small websites to enterprise e-commerce webshops.
13 |
14 | ## Backend development
15 |
16 | Or server-side development, is the engine behind the user interfaces. Server-side infrastructure encompasses various servers, databases, and server-side applications that power the frontend. It’s in charge of storing, managing and providing data, performing various tasks and calculations, and determining decisions that impact the frontend.
17 |
18 | The backend primarily ensures the delivery of data and services, typically through an application programming interface (API). An API is like a common language between systems and services, that allow various applications to communicate with each other and transport data.
19 |
20 | Common languages and frameworks used in backend development include Python (with Django), Ruby (with Ruby on Rails), PHP (with Laravel), Java (with Spring), and C# (.NET Framework).
21 |
22 | In addition to languages and frameworks, BE development also involves working with databases (Database Management Systems). Some popular databases include MySQL, PostgreSQL, MongoDB, and Oracle.
23 |
24 | Although commonly backend lives on the internet somewhere, it’s possible to have a backend system locally on your machine, especially during development, but more on this later.
25 |
26 | ## Conclusion
27 |
28 | Frontend is the face of a given product, a way for us to see and manage data in a user-friendly way, while Backend is the workhorse of a product, providing and actually storing data, performing complex operations on powerful machines.
29 |
30 | A frontend application lives inside a client (a smart phone, a browser, a fridge) while the backend lives on the server, allowing the frontend to be fast and lightweight, while leveraging the backend for complex data management and computing.
--------------------------------------------------------------------------------
/Knowledge/Infrastructure/Introduction.md:
--------------------------------------------------------------------------------
1 | In order to effectively test any software, we need to have a solid understanding of not only the application itself, but also the underlying infrastructure that supports it. These days, applications are rarely standalone - they interact with databases, depend on various services, utilize different environments, and run on complex platforms. Understanding the underlying factor greatly enhances our ability to test effectively and precisely, write comprehensive and accurate test cases, and generate meaningful bug reports.
2 |
3 | In this section we provide an overview of key infrastructure concepts that play vital roles in a software development lifecycle. From understanding various environments, differentiating between frontend and backend, to demystifying terms like Docker, Kubernetes, CI/CD, we talk about these topics in a concise and simplified way.
4 |
5 | Remember, a tester with a good grasp of infrastructure can better understand how applications function, how they interact with various components, and where potential weaknesses may lie. The broadened perspective enhances your testing strategies and ultimately contributes to building better software.
--------------------------------------------------------------------------------
/Knowledge/Literature and resources.md:
--------------------------------------------------------------------------------
1 | > *Quality means doing it right even when no one is looking.*
2 |
3 | ## Books
4 |
5 | Some cool books to jumpstart your QA career:
6 |
7 | - [Lessons Learned in Sofware Testing](https://www.amazon.com/Lessons-Learned-Software-Testing-Context-Driven/dp/0471081124)
8 | - [Agile Testing](https://www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468)
9 | - [Fifty Quick Ideas To Improve Your Tests](https://www.amazon.com/Fifty-Quick-Ideas-Improve-Tests-ebook/dp/B00XVFFK7E)
10 | - [Explore It!: Reduce Risk and Increase Confidence with Exploratory Testing](https://www.amazon.com/Explore-Increase-Confidence-Exploratory-Testing/dp/1937785025)
11 | - [Elements of Excellent Software Tesring](https://www.satisfice.com/download/elements-of-excellent-testing)
12 |
13 | ## Our blog posts
14 | - [10 Principles of Successful App Testing](https://infinum.com/the-capsized-eight/10-app-testing-principles)
15 | - [AI Software Testing–Myth or Reality?](https://infinum.com/the-capsized-eight/ai-testing-myth-or-reality)
16 | - [Bystander or Revolutionary: How to Bring Value to Software Projects](https://infinum.com/the-capsized-eight/how-to-bring-value-to-software-projects)
17 | - [FAQ about QA](https://infinum.com/blog/faq-software-testing/)
18 | - [Google Play Console vs. iTunes Connect in 2018](https://infinum.com/the-capsized-eight/google-play-console-vs-itunes-connect-2018)
19 | - [How to Get Along with Developers without Group Therapy: A QA Guide](https://infinum.com/blog/developer-tester-relationship/)
20 | - [How Not to Suck at Writing Bug Reports](https://infinum.com/the-capsized-eight/how-not-to-suck-at-writing-bug-reports)
21 | - [Negative Scenarios in Software Testing: Best Practices](https://infinum.com/blog/negative-scenarios-in-software-testing-best-practices/)
22 | - [Testing Flutter Apps – A QA Guide](https://infinum.com/blog/testing-flutter-apps-a-qa-guide/)
23 | - [The Infinum Test Lab: Device Testing](https://infinum.com/the-capsized-eight/the-infinum-test-lab-device-testing)
24 | - [The QA Fairy Godmother: 10 Practices for Happily Ever After](https://infinum.com/the-capsized-eight/the-qa-fairy-godmother-10-practices-for-happily-ever-after)
25 | - [Want Better Collaboration on Development Projects? Try BDD](https://infinum.com/the-capsized-eight/want-better-collaboration-on-development-projects-try-bdd)
26 | - [Writing API Tests? Postman Delivers](https://infinum.com/the-capsized-eight/postman-API-testing)
27 | - [You Think Your App Is Ready for Publishing? Well, Think Again.](https://infinum.com/the-capsized-eight/you-think-your-app-is-ready-for-publishing-well-think-again)
28 | - [How to Successfully Improve QA Testing Processes](https://infinum.com/blog/improve-qa-testing-process/)
29 | - [Can You Hear the Bug? – An Intro to Audio Software Testing](https://infinum.com/blog/audio-software-testing/)
30 | - [How to Get Started with Accessibility Testing](https://infinum.com/blog/how-to-get-started-with-accessibility-testing/)
31 | - [Don’t Think Twice, Take the ISTQB Foundation Level Exam](https://infinum.com/blog/istqb-foundation-level-exam/)
32 | - [Testing Flutter Apps – A QA Guide](https://infinum.com/blog/testing-flutter-apps-a-qa-guide/)
33 |
34 |
35 | ## Blog posts about writing blog posts
36 |
37 | If you will be writing a blog post here is a useful list of blog posts which contain good tips and tricks about writing blog posts:
38 |
39 | - [How to Write an Awesome Blog Post in 5 Steps](https://www.wordstream.com/blog/ws/2015/02/09/how-to-write-a-blog-post)
40 | - [8 Writing Tips I Wish I Knew Before I Started Blogging](https://blog.hubspot.com/marketing/8-essential-writing-tips)
41 |
42 | ## Other
43 | - [9 essential blogs](https://www.rainforestqa.com/blog/2017-12-21-9-essential-blogs-every-qa-team-should-read-in-2018/)
44 | - [A list of software testing conferences](https://testingconferences.org/)
45 | - [Developsense blog](https://www.developsense.com/blog/)
46 | - [Guru99 Software testing](https://www.guru99.com/software-testing.html)
47 | - [Ministry of Testing newsletter](https://www.ministryoftesting.com/newsletter)
48 | - [Ministry of Testing - 30 things every new software tester should learn](https://www.ministryoftesting.com/dojo/lessons/30-things-every-new-software-tester-should-learn)
49 | - [Monkeyuser](https://www.monkeyuser.com/)
50 | - [QA Reacts](http://qareacts.tumblr.com/)
51 | - [Satisfice blog](https://www.satisfice.com/blog/)
52 | - [State of testing](https://qablog.practitest.com/state-of-testing/)
53 |
--------------------------------------------------------------------------------
/Knowledge/UI & UX - Android.md:
--------------------------------------------------------------------------------
1 | > *You can't use up creativity. The more you use, the more you have.*
2 |
3 | [Material Design] (https://material.io/) is an open - source design system created by Google and used for creating Android apps UI that is usable and beautiful. Material Components are interactive building blocks for creating a user interface.
4 |
5 | ### Bars
6 |
7 | Element name | Definiton / Picture / GIF
8 | -----|-----------
9 | Bottom Bar|  A bottom app bar displays navigation and key actions at the bottom of mobile screens.
10 | Bottom Navigation|  Bottom navigation bars allow movement between primary destinations in an app.
11 | Tabs|  Tabs organize content across different screens, data sets, and other interactions.
12 | Top Bar|  The top app bar displays information and actions relating to the current screen.
13 |
14 | ### Buttons
15 |
16 | Element name | Definiton / Picture / GIF
17 | -----|-----------
18 | Floating Action Button (FAB)|  A floating action button (FAB) represents the primary action of a screen.
19 |
20 | ### Misc
21 |
22 | Element name | Definiton / Picture / GIF
23 | -----|-----------
24 | Backdrop|  A backdrop appears behind all other surfaces in an app, displaying contextual and actionable content.
25 | Banner|  A banner displays a prominent message and related optional actions.
26 | Card|  Cards contain content and actions about a single subject.
27 | Chips|  Chips are compact elements that represent an input, attribute, or action.
28 | Dialog|  Dialogs inform users about a task and can contain critical information, require decisions, or involve multiple tasks.
29 | Divider|  A divider is a thin line that groups content in lists and layouts.
30 | Image List|  Image lists display a collection of images in an organized grid.
31 | List|  Lists are continuous, vertical indexes of text or images.
32 | Snackbar|  Snackbars provide brief messages about app processes at the bottom of the screen.
33 | Tooltip|  Tooltips display informative text when users hover over, focus on, or tap an element.
34 |
35 | You can find more on [Material.io] (https://material.io/components/).
36 |
--------------------------------------------------------------------------------
/Knowledge/UI & UX - Basics.md:
--------------------------------------------------------------------------------
1 | > *Right or wrong, it’s very pleasant to break something from time to time*
2 |
3 | UX design refers to user experience design, while UI design stands for user interface design. Both of these are crucial to an IT product and need to work closely together.
4 |
5 | Despite being very integral to each other, the roles themselves are quite different, involving distinct processes.
6 |
7 | ## What is UI design?
8 |
9 | The user interface is the graphical layout of an application.
10 |
11 | It consists of the buttons users click on, the text they read, the images, sliders, text entry fields, and all the rest of the items the user interacts with.
12 |
13 | This includes screen layout, transitions, interface animations and every single micro-interaction. Any sort of visual element, interaction, or animation must all be designed.
14 |
15 | UI designers create the look and feel of an application’s user interface.
16 |
17 | ## What is UX design?
18 |
19 | A user’s experience of the app is determined by how they interact with it.
20 |
21 | Is the experience smooth and intuitive or clunky and confusing? Does navigating the app feel logical or does it feel arbitrary?
22 |
23 | Does interacting with the app give people the sense that they’re efficiently accomplishing the tasks they set out to achieve or does it feel like a struggle?
24 |
25 | User experience is determined by how easy or difficult it is to interact with the user interface elements that the UI designers have created.
26 |
27 | ### UI elements
28 |
29 | Every day we work on tasks, write bug reports, check apps design, write test cases, etc. It's important to use a correct naming for different elements in the app so everyone on the project is on the same page. Of course, some elements have various names.
30 |
31 | In the next few sections, UI elements are shown. They are divided in three pages: web apps, iOS apps and Android apps.
32 |
33 | These can also serve as helpful intros:
34 |
35 | - [Glossary of navigation elements](https://tubikstudio.com/uiux-design-glossary-navigation-elements/)
36 |
37 | - [15 basic types of screens](https://tubikstudio.com/mobile-ui-design-15-basic-types-of-screens/)
38 |
39 | ### UI elements Understanding the User's Perspective in UX Design
40 | At the core of UX design lies the imperative to understand the user's perspective thoroughly. UX designers are tasked with ensuring that the application aligns with user needs, goals, and expectations. To achieve this, they delve deep into user psychology, studying behaviors, preferences, and pain points to craft a seamless and intuitive experience.
41 |
42 | ### Key Steps in UX Design
43 |
44 | * **User Research**: UX designers use surveys, interviews, usability testing, and analytics to gather insights into user behaviors and preferences.
45 |
46 | * **Information Architecture**: They organize content and features logically for easy user navigation and task completion.
47 |
48 | * **Prototyping and Testinge**: UX designers create prototypes, test with users, and iteratively improve product layout and functionality.
49 |
50 | * **Usability and Accessibility**: They ensure inclusivity by designing for various abilities, screen sizes, and adhering to accessibility standards like WCAG.
51 |
52 | While UX and UI design are distinct disciplines, they are closely intertwined. UX designers provide the foundational user-centric research and structure upon which UI designers build. The UI elements and visual aesthetics created by UI designers should align with the user experience principles established by UX designers to create a cohesive and enjoyable product.
--------------------------------------------------------------------------------
/Knowledge/UI & UX - Web - Part 1.md:
--------------------------------------------------------------------------------
1 | > *Every great design begins with an even better story.*
2 |
3 | 
4 |
5 | ### Menus
6 |
7 | Element name | Definiton / Picture / GIF
8 | -----|-----------
9 | Accordion|  Accordions are useful when you want to toggle between hiding and showing large amount of content
10 | Breadcrumbs Navigation|  Breadcrumbs navigation is a way to show your users their location and how they got there
11 | Fixed Menu| 
12 | Fixed Sidebar| 
13 | Full Page Tabs| 
14 | Fullscreen Navigation| 
15 | Hover Tabs| 
16 | Menu Icon| 
17 | Off-Canvas Menu| 
18 | Pagination| 
19 | Search Bar| 
20 | Side Navigation| 
21 | Sticky Navbar| 
22 | Sticky Social Bar| 
23 | Tab Headers| 
24 | Tabs|  Tabs are perfect for single page web applications, or for web pages capable of displaying different subjects
25 | Top Navigation or Topnav| 
26 | Vertical Tabs| 
27 |
28 | ### Images
29 |
30 | Element name | Definiton / Picture / GIF
31 | -----|-----------
32 | Image Grid| Image grid is an image gallery that varies between four, two or full-width images with a click of a button
33 | Image Overlay Title| 
34 | Modal Images|  A modal is a dialog box/popup window that is displayed on top of the current page
35 | Slideshow|  A slideshow is used to cycle through elements
36 |
--------------------------------------------------------------------------------
/Knowledge/UI & UX - Web - Part 2.md:
--------------------------------------------------------------------------------
1 | > *The alternative to good design is always bad design. There is no such thing as no design.*
2 |
3 | ### Tables
4 |
5 | Element name | Definiton / Picture / GIF
6 | -----|-----------
7 | Comparison Table| 
8 |
9 | ### Miscellaneous
10 |
11 | Element name | Definiton / Picture / GIF
12 | -----|-----------
13 | Favicon|  Favicon is also known as a shortcut icon, website icon, tab icon, URL icon, or bookmark icon, is a file containing one or more small icons, associated with a particular website or web page.
14 | CTA button|  Call to action button is the part of the landing page that the user needs to click in order to take the action you want them to take.
15 | Loader| 
16 | Modal Boxes|  A modal is a dialog box/popup window that is displayed on top of the current page
17 | Overlay Effect| 
18 | Parallax| Parallax scrolling is a web site trend where the background content (i.e. an image) is moved at a different speed than the foreground content while scrolling.
19 | Popups|  On click
20 | Progress Bars| 
21 | Range Sliders| 
22 | Scroll Indicator| 
23 | Section Counter|  A section counter is used to tell people how well their business is going, by displaying interesting numbers
24 | Smooth Scroll| 
25 | Snackbar or Toast| 
26 | Star Rating| 
27 | Tooltips|  On hover
28 | Fullscreen Search| 
29 | Toggle Switch| 
30 |
--------------------------------------------------------------------------------
/Knowledge/UI & UX - iOS.md:
--------------------------------------------------------------------------------
1 | > *The public is more familiar with bad design than good design.*
2 |
3 | Three primary themes differentiate iOS from other platforms:
4 |
5 | * **Clarity.** Throughout the system, text is legible at every size, icons are precise and lucid, adornments are subtle and appropriate, and a sharpened focus on functionality motivates the design. Negative space, color, fonts, graphics, and interface elements subtly highlight important content and convey interactivity.
6 |
7 | * **Deference.** Fluid motion and a crisp, beautiful interface help people understand and interact with content while never competing with it. Content typically fills the entire screen, while translucency and blurring often hint at more. Minimal use of bezels, gradients, and drop shadows keep the interface light and airy, while ensuring that content is paramount.
8 |
9 | * **Depth.** Distinct visual layers and realistic motion convey hierarchy, impart vitality, and facilitate understanding. Touch and discoverability heighten delight and enable access to functionality and additional content without losing context. Transitions provide a sense of depth as you navigate through content.
10 |
11 | ### Bars
12 |
13 | Element name | Definiton / Picture / GIF
14 | -----|-----------
15 | Navigation Bar|  A navigation bar appears at the top of an app screen, below the status bar, and enables navigation through a series of hierarchical screens.
16 | Navigation Bar Title|  A navigation bar title helps people understand what they’re looking at.
17 | Search Bar|  A search bar allows people to search through a large collection of values by typing text into a field.
18 | Status Bar|  The status bar appears along the upper edge of the screen and displays useful information about the device’s current state, like the time, cellular carrier, network status, and battery level.
19 | Tab Bar|  A tab bar appears at the bottom of an app screen and provides the ability to quickly switch between different sections of an app.
20 | Toolbar|  A toolbar appears at the bottom of an app screen and contains buttons for performing actions relevant to the current view or content within it.
21 |
22 | ### Views
23 |
24 | Element name | Definiton / Picture / GIF
25 | -----|-----------
26 | Popover|  A popover is a transient view that appears above other content onscreen when you tap a control or in an area.
27 | Scroll View| A scroll view allows users to browse content, such as text in a document or a collection of images, that’s larger than the visible area.
28 | Split View| A split view manages the presentation of two side-by-side panes of content, with persistent content in the primary pane and related information in the secondary pane. Each pane can contain any variety of elements, including navigation bars, toolbars, tab bars, tables, collections, images, maps, and custom views.
29 |
30 | ### Controls
31 |
32 | Element name | Definiton / Picture / GIF
33 | -----|-----------
34 | Activity Indicator|  An activity indicator spins while an unquantifiable task, such as loading or synchronizing complex data, is performed.
35 | Page Control|  A page control shows the position of the current page in a flat list of pages.
36 | Date Picker|  A date picker is an efficient interface for selecting a specific date, time, or both.
37 | Slider|  A slider is a horizontal track with a control called a thumb, which you can slide with your finger to move between a minimum and maximum value, such as screen brightness level or position during media playback.
38 | Stepper|  A stepper is a two-segment control used to increase or decrease an incremental value.
39 | Switch|  A switch is a visual toggle between two mutually exclusive states—on and off.
40 |
41 | You can find more on [Human Interface Guidelines] (https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/).
42 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # QA team handbook 🐞
2 |
3 | This Handbook is used for onboarding new Infinum employees to the QA team's processes.
4 |
--------------------------------------------------------------------------------
/Testing/Testing - Design Review.md:
--------------------------------------------------------------------------------
1 | > If a picture is worth a thousand words, a prototype is worth a thousand meetings. - Tom and David Kelley
2 |
3 | Design review is a process in which we evaluate requirements and check the overall state of the app/feature to ensure that it's done and ready to be released. It serves as a final QA + design check to make sure everything looks and works as it's intended.
4 |
5 | **When is the right time to do a design review?**
6 |
7 | - Before release (standard)
8 | - After a feature is done, before releasing it (ideal, but not suitable for every project)
9 | - At the end of every sprint (not bad, but can be too often)
10 |
11 | What if the app is already in production? If we never had a design review, this will be the case, but we'd like to avoid this.
12 |
13 | The ideal case is to implement design reviews from the start of the project. That includes 2 things:
14 |
15 | 1. Do a design review when a new feature is finished and before it goes into production.
16 | 2. Occasionally do the design review for the whole project to ensure everything is still cohesive and up to date.
17 |
18 | **How do I do it?**
19 |
20 | 1. You should work with a designer that is either assigned to that project, or (if there is no active designer) another designer that has time and some knowledge about the project. If no one is available, scheduling can be arranged with operations, PMs, and design TLs.
21 |
22 | 2. Organize a recurring event where the two of you will go through the app and work together to find bugs and come up with improvements.
23 |
24 | 3. All your findings should be documented somewhere - that can be a document, sheet, Figma file, or any place of choice. You can communicate this with the designer and agree on what's the easiest thing to do for your way of working and the project.
25 |
26 | 4. The most important thing - for every bug/improvement there should be an open Productive/Jira task.
27 |
28 | **What now?**
29 |
30 | When you've gone through the app/feature, found bugs and opened tasks for them - now all there is left is to follow their progress. They should be fixed and implemented in upcoming sprints, and shouldn't be left in the backlog for too long. When they are fixed - you can update your documentation (from step 3) so everyone can see the current state of the design review.
31 |
32 | **How does this look in real life?**
33 |
34 | Here are two examples of design reviews, one done in Figma, and one done in Sheets. Documentation is optional, but task opening is always mandatory.
35 |
36 | *Example of a design review in Figma:*
37 |
38 | 
39 |
40 | 
41 |
42 | 
43 |
44 |
45 |
46 | *Example of a design review in Excel sheet:*
47 |
48 | ]
49 |
50 |
--------------------------------------------------------------------------------
/Testing/Testing - Testing session.md:
--------------------------------------------------------------------------------
1 | > Alone we can do so little, together we can do so much. — Helen Keller
2 |
3 |
4 | ## Introduction
5 |
6 | The testing session is an event you can integrate into your process of releasing a mobile or a web app. The idea is to create a meeting with colleagues from the project you are working on and test as a group. You can invite all team members - developers, designers, testers, and your project manager. If the clients are up for it, you can invite them as well.
7 |
8 | Testers execute regression tests on most projects to check if everything works as expected before the production release. Test docs are often used to guide those regression tests. Testing sessions are not meant to replace those scripted regression tests, they are a supplementary process.
9 |
10 |
11 | ## Benefits of testing sessions
12 |
13 | There are a lot of benefits to organizing a testing session with your project team:
14 |
15 | - Since every project member gets involved in the testing process, they are introduced to parts of the system they don't know well. For example, it's a great way for a backend developer to become more familiar with the frontend.
16 | - The testing session is a great way to find a lot of bugs in a short period.
17 | - Since testing sessions are collaborative, they help project members become closer and improve the team spirit.
18 | - Adding additional pairs of eyes helps find lots of issues fast.
19 |
20 |
21 | ## Basic steps
22 |
23 | 1. Explain the purpose and benefits of a testing session to your project team.
24 | 2. Create a calendar event for the testing session.
25 | 3. Prepare a test plan.
26 | 4. Make a small introduction for the app/features that will be tested.
27 | 5. Test the app during the testing session.
28 | 6. Collect all the issues that were found and open tasks in your project management tool.
29 |
30 |
31 | ## What is your role?
32 |
33 | A tester that organizes the testing session event is also a moderator. Make sure to:
34 |
35 | - Prepare everything that is needed for the testing session. That includes the test plan, test devices, and access to various browsers or Browserstack.
36 | - Manage the session and help participants in case they get stuck or need some guidance during testing.
37 |
38 |
39 | ## Creating a test plan
40 |
41 | The organizer should create a test plan for all the participants of the testing session.
42 |
43 | A good practice is to divide the application by features or specific parts which need to be tested and then allocate every part to a participant of the testing session. The test plan should include:
44 |
45 | - General information and preconditions: build, link to the design (Figma, Zeplin), link to the page, etc.
46 | - Test plan for each of the participants: list of modules/features to test, which device/browser to use.
47 | - A place where they can report bugs that they find.
48 |
49 |
50 | Later on, when the time is up and the bugs you all found are on the list, the moderator should create a task for every bug in the project management tool (Productive, Jira, etc.).
51 |
52 | You can find the template for the testing session [here](https://docs.google.com/spreadsheets/u/0/d/1-K0ruKggRnxOOEhLa_vrt8yjDWaxHQZO9QvCtuIlpPo/edit). Feel free to copy it and use it for your project.
53 |
54 | ## General tips for the testing session
55 |
56 | - A testing session event should usually last for 2-3 hours. It can be divided into more sessions depending on the number of features being tested. Of course, it also depends on how much time your participants have at their disposal.
57 | - When possible, create a friendly and comfy environment. For example, bring sweets and drinks. You can even play some quiet music.
58 | - In case of duplicates, make sure to merge all the issues before reporting them into your project management tool. Don’t bother organizing them during the session itself.
59 | - If the testing session is hybrid, make sure that everyone has at least one device for testing and try to include them in the conversation. Using webcams and sharing your screen can help.
60 | - Testing is usually done on a non-production environment which needs to be as similar as possible to the production environment. If there is no production environment, make sure that no changes are being deployed to your chosen environment while the testing session is under way.
61 |
--------------------------------------------------------------------------------
/Tools/Test Recorders.md:
--------------------------------------------------------------------------------
1 | > It's automation, not automagic. — Jim Hazen
2 |
3 | ## What are test recorders?
4 |
5 | Test recorders are software tools that are recording steps that testers are doing while manually testing web-based apps. But not just that - they also gather a lot of information regarding properties of elements, input field values, conditions, validations, and much more, depending on the tool you use.
6 |
7 | Once the steps are recorded, by pressing the start button the test will repeat itself with the exact steps the tester previously made. The great thing about it is that steps can be modified based on various parameters that you would need in future test runs.
8 |
9 | ## When to use test recorders?
10 |
11 | The best use cases for test recorders are tests that require a lot of step repetition over and over again. Besides that, tests have to be bullet-proof on all supported browsers.
12 |
13 | Test recorders are great for all manual testers and even better for someone who is considering doing test automation on a daily basis. These tools will surely help you to think like a test automation engineer because there are many things to consider
14 | when you create tests this way. To be future-proof, the use of some advanced options for validation like locators, waits, breakpoints, and others will be a must.
15 |
16 | ## Testim introduction
17 |
18 | Testim is a testing platform that uses AI for authoring, execution, and maintenance of automated tests. It offers great integration with various services and apps:
19 |
20 | - **Git integration** - always up to date with the latest code version
21 | - **Apps and services** - Slack, Browserstack, TestRail
22 | - **Run test with CLI** - CI (i.e. Jenkins, CircleCI, Azure pipelines…) or local on your browser, also there is *testim grid* with grid management (run tests on all well-known browsers at once)
23 | - **Testim REST API** - you can do actions with branches (create, merge, and others), retrieve and run tests
24 | - **Labs** - better organization of tasks (visual, webhook integration for notifications)💰
25 | - **Bug tracker** - Jira, Slack, Trello, GitHub
26 | - **Report** - weekly email report💰
27 |
28 | 
29 |
30 | After the test is successfully recorded all the steps will be shown in a grid on a very user-friendly UI.
31 |
32 | 
33 |
34 | ### Some key features of Testim:
35 |
36 | - **Element lock-in** - automatically detecting locators without user action
37 | - **Steps share** - steps or groups of tests can be reused across different tests
38 |
39 | 
40 |
41 | - **Visual configuration** - reordering, deleting, skipping steps based on the scenario of the test itself
42 | - **Customizable with code** - insert custom JavaScript code (i.e. for clearing cookies or something different) with a real JS editor
43 |
44 |
45 | 
46 |
47 | ### Real-life testing
48 |
49 | This tool was used on one of our projects and the experience from that testing was positive:
50 |
51 | - Steps are recorded well - if there was some issue with some individual steps, they were fixed easily because you can start the test from a specific step and skip the problematic ones or disable them for that run
52 | - Since all steps are editable you can also add specific locators, login data, conditions, wait for a condition where you think that it is needed
53 | - Surprisingly, attaching an image from the folder on the local computer to the web page works like a charm - it tracks and records your clicks where you attach the image from your folder on the computer and attaches it the same way
54 | - Running the whole suite with multiple individual tests was also possible in the free version.
55 |
56 | ## Compared to Selenium IDE
57 |
58 | Selenium IDE is a selenium-powered test recorder. In comparison to Selenium IDE, Testim has more AI features integrated with it. Some basic actions are working much better on Testim and it doesn't get confused so easy during test recording (i.e. when the 1Password popup is shown on the login screen, Selenium IDE gets confused sometimes and won't pass that step).
59 |
60 | **Differences that are most noticeable between the two are:**
61 |
62 | - Selenium IDE is a web extension and Testim is a full web application
63 | - UI/UX is much better on Testim
64 | - More control options for step manipulation and editing in Testim
65 | - Better integration options in Testim that are easy to use and which are not available in Selenium IDE
66 | - Integration options are easier accessible and visible at first sight in Testim, whereas on Selenium IDE you need to dig deeper to find some advanced option
67 | - Better overview of the state of tests, statistics, test suites, and more
68 |
69 | 
70 |
71 | For users that are not familiar at all with web testing and elements that you need to adapt or customize, Testim is a much better option even in the free version because Selenium IDE requires some learning curve. Some features in Selenium IDE are not visible or understandable at first sight.
72 |
--------------------------------------------------------------------------------
/Tools/Using ADB.md:
--------------------------------------------------------------------------------
1 | > *He who thinks a tool can solve all problems, has a new problem.*
2 |
3 | ## What is ADB?
4 |
5 | Android Debug Bridge (ADB) is a versatile command-line tool that lets you communicate with a device. The ADB command facilitates a variety of device actions, such as installing and debugging apps, and it provides access to a Unix shell that you can use to run a variety of commands on a device. It is a client-server program that includes three components:
6 |
7 | **- A client,** which sends commands. The client runs on your development machine. You can invoke a client from a command-line terminal by issuing an adb command.
8 |
9 | **- A daemon (adbd),** which runs commands on a device. The daemon runs as a background process on each device.
10 |
11 | **- A server,** which manages communication between the client and the daemon. The server runs as a background process on your development machine.
12 |
13 | ## Install ADB using Homebrew
14 |
15 | This is the easiest way and will provide automatic updates:
16 |
17 | **1.** Install [Homebrew](https://brew.sh/)
18 |
19 | **2.** Open terminal and run: `brew install --cask android-platform-tools`
20 |
21 | **3.** Start using adb: `adb devices`
22 |
23 | ## How to use ADB
24 |
25 | **USB connection**
26 |
27 | 1. Connect the Android device -> USB cable -> USB dongle -> Mac and activate [“Developer mode”](https://infinum.com/handbook/books/qa/Testing/Testing%20-%20Mobile#enabling-developer-options) on the Android device.
28 |
29 | 2. Mark the option “Enabling USB Debugging”.
30 |
31 | 3. Allow USB Debugging to be performed in the security panel.
32 |
33 | 4. Make sure that the device is successfully connected by running: `adb devices`
34 |
35 | **WIFI connection**
36 |
37 | 1. First of all, connect the Android device via USB cable.
38 |
39 | 2. Connect Android devices and Mac on the same WIFI network
40 |
41 | 3. Open terminal and run:
42 |
43 | `adb tcpip 5555`
44 |
45 | `adb connect 192.168.0.101:5555`
46 |
47 | Be sure to replace `192.168.0.101` with the IP address that is actually assigned to your Android device. Now disconnect USB cable and run `adb devices` , your device should be listed as connected.
48 |
49 | ## ADB basic commands
50 | Print a list of connected devices: `adb devices`
51 |
52 | Kill the ADB server: `adb kill-server`
53 |
54 | Install an application: `adb install`
55 |
56 | Set up port forwarding: `adb forward tcp:6100 tcp:7100`
57 |
58 | Copy a file/directory from the device: `adb pull`
59 |
60 | Copy a file/directory to the device: `adb push`
61 |
62 | Initiate an ADB shell: `adb shell`
63 |
64 | ## Example of useful testing ADB commands
65 | `adb logcat`
66 | Print the current device log to the console.
67 |
68 | `adb logcat -d > [path_to_file]`
69 | Save the logcat output to a file on the local system.
70 |
71 | `adb logcat -c`
72 | The parameter -c will clear the current logs on the device.
73 |
74 | `adb logcat packagename:[priority level: V, D, I, W, E, F, S]`
75 | Filter log files by priority e.g. adb logcat com.myapp:E which prints all error logs of the given app.
76 |
77 | `adb bugreport > [path_to_file]`
78 | Will dump the whole device information like dumpstate, dumpsys and logcat output.
79 |
80 | `adb shell screencap -p /sdcard/screenshot.png`
81 | Will create a screenshot of the current screen on the given file location.
82 |
83 | `adb shell screenrecord /sdcard/NotAbleToLogin.mp4`
84 | Will start a recording of the current screen. With CMD+c the current recording can be stopped.
85 |
86 | `adb shell cmd package list packages`
87 | This will return a list of the package names of the apps installed on the device.
88 |
89 | `adb shell monkey -p com.myAppPackage -v 10000 -s 100`
90 | With the help of this command the monkey tool is generating 10.000 random events on the real device. Note: Use the parameter -s (seed) to execute the same commands over and over again in order to reproduce any crashes that happen during the monkey run.
91 |
92 | If you thirst for more knowledge on ADB, check out this [link](https://www.automatetheplanet.com/adb-cheat-sheet/).
93 |
--------------------------------------------------------------------------------
/Tools/Using Android Vitals.md:
--------------------------------------------------------------------------------
1 | >*“Never allow the same bug to bite you twice.” Steve Maguire*
2 |
3 | Android Vitals is a part of the Google Play Console that allows you to have a deeper insight
4 | into the stability of your app on Android devices up to the last 3 months.
5 |
6 | It can be accessed by navigating to your app on **[Google Play Console](https://play.google.com/console)** and in the menu on the
7 | left dropdown the “Android vitals”. From there, you can access Overview, Performance,
8 | Crashes and ANRs, and App size options with unique insights into the performance of the
9 | app.
10 |
11 | Selecting the “Crashes and ANRs” option will show you a list of issues based on how
12 | frequent they are, from there, you can choose any issue and inspect it more thoroughly.
13 | The details screen will contain information about the failed method, such as the number of
14 | affected users and graphs depicting the affected users' setup (App version, OS version,
15 | device). You can also inspect the stack trace for more information about the occurrence of
16 | the issue.
17 |
18 | The "App size" option shows a comparison of the size of your app and the average size of
19 | the apps in your peer group, as well as the difference between older versions of your app.
20 | You are also offered recommendations for optimizing the size of your app.
21 |
22 | The “Performance” dropdown menu offers the possibility to improve your app’s performance
23 | by integrating the Android Performance Tuner, which enables you to find the most effective
24 | way to deliver the best possible experience to each of your users by helping you to measure
25 | and optimize frame rates, graphical fidelity, loading time, and loading abandonment across
26 | many Android devices at scale.
27 |
28 | The most useful tool to you as a developer is the “Overview” option, where you are
29 | presented with graphs depicting your app's performance compared to the peers’ median and
30 | the bad behaviour threshold. Going into details, you are able to filter out the behaviour by
31 | app version (“Artifact”), Android OS version, device, and location of the user. By choosing
32 | “View details” under one of the graphs, you will be navigated to the “Android vitals details”
33 | page with detailed information about the performance of the app split into five tabs.
34 |
35 | ### Stability
36 |
37 | Under the stability tab, you can go into details about crashes and “App not responding”
38 | rates.
39 |
40 | * User-perceived ANR/Crash rate - the percentage of daily active users who have
41 | noticed an ANR or crash
42 | * ANR/Crash rate - the percentage of daily sessions with at least one ANR/Crash
43 | * Multiple ANR/Crash rate - the percentage of daily sessions with at least two
44 | ANRs/Crashes
45 |
46 | ### Loading
47 |
48 | The Loading tab gives you insight into the startup times of your app.
49 |
50 | *Cold start is when the app is completely closed, and warn start is when you kill the app and
51 | then immediately open it again, in which case all app processes have not been killed yet so
52 | the start of the app is a bit faster than the cold start. Hot start is opening the app from the
53 | background.*
54 |
55 | * Slow cold start - the percentage of daily sessions with at least one cold startup time
56 | of more than five seconds
57 | * Slow warm start - the percentage of daily sessions with at least one warm startup
58 | time of more than two seconds
59 | * Slow hot start - the percentage of daily sessions with at least one hot startup time of
60 | more than 1.5 seconds
61 |
62 | ### Rendering
63 |
64 | The Rendering tab examines how fast your app displays frames on the screen
65 |
66 | * Excessive slow frames - the percentage of daily sessions with more than 50% of
67 | slow frames
68 | * Excessive frozen frames - the percentage of daily sessions with more than 0.1% of
69 | frames with a time longer than 700 ms
70 |
71 | ### Battery
72 |
73 | Under the battery tab, you are given a better insight into the excessive usage of the users’
74 | battery
75 |
76 | * Excessive wake-ups - the percentage of sessions in which the app averaged more
77 | than 10 wake-ups per hour
78 | * Stuck partial wake locks (background) - the percentage of sessions in which the app
79 | had one or more partial wake locks per hour while in the background
80 | * Excessive background Wi-Fi scans - the percentage of sessions in which the app
81 | averaged more than four WiFi scans per hour while in the background
82 | * Excessive background network usage - the percentage of sessions in which the app
83 | used more than 50 MB of network data per day while in the background
84 |
85 | ### Permissions
86 |
87 | Here you can see the percentage of users who have denied permissions to your app
88 |
89 | * The percentage of daily sessions in which the user denied your app at least one
90 | requested permission
91 | * You are able to see the percentage of permissions denied per app version, android
92 | version, permission group, device, and country/region
93 | * Unlike other data, permission denials are not compared to the peers’ median
--------------------------------------------------------------------------------
/Tools/Using Appbot.md:
--------------------------------------------------------------------------------
1 | > *We see our customers as invited guests to a party, and we are the hosts. It’s our job to make the customer experience a little bit better.* - Jeff Bezos
2 |
3 | ## What's Appbot?
4 |
5 | Appbot is a tool for collecting and monitoring user app reviews and ratings.
6 |
7 | ### How to use Appbot
8 |
9 | 1. Log in to the **Appbot** account and click on **Manage Sources** in the navigation bar.
10 | 2. Choose an app from the sources list *(Note: if you can't find the app you are looking for in the Sources list, you can add it manually)*
11 |
12 | A page containing reviews, ratings and other statistics for the chosen app should open. There you can find many filtering and analysis options for user reviews and ratings:
13 |
14 | 
15 |
16 | ### How to integrate Appbot with Slack
17 |
18 | Among other options, Appbot can automatically send Google Play and App Store reviews to Slack (and other apps/services as well), making it easier to monitor user reviews.
19 |
20 | Setting up a Slack integration for an Appbot account takes only a few minutes:
21 |
22 | 1. Log in to the **Appbot** account and click on **Manage Sources** in the navigation bar.
23 | 2. In the sources list, find the app you want to integrate with Slack and click on the "+" button under the Integrations column. *(Note: if you can't find the app you are looking for in the Sources list, you have to add it)*
24 | 3. Find **Slack** and click on the **Add Integration** button.
25 | 4. Click **Add to Slack**.
26 | 5. Sign in to your **Slack** account.
27 | 6. Choose which **channel** you would like Appbot to send the reviews to and click **Allow**.
28 | 7. Choose which reviews you would like sent to Slack (e.g. weekly summaries, individual reviews, specific star ratings, countries, etc.).
29 | 8. Click **Save** once you’re done.
30 |
31 | Congrats, you’ve set up your Slack integration! :)
32 |
33 | Depending on your needs, you can easily set up filtering of the reviews you send to Slack, e.g. by star rating, country/language or topic.
34 |
35 | The reviews sent to Slack contain quick links so that you can reply to user reviews quickly and easily.
36 |
37 | Here is an example of a review sent to Slack:
38 |
39 | 
40 |
--------------------------------------------------------------------------------
/Tools/Using Newman.md:
--------------------------------------------------------------------------------
1 | > *Hello, Jerry!*
2 |
3 | Sometimes you need to combine the power of Postman with your regular old CI/CD services. That's where Newman comes in handy.
4 |
5 | ## What is Newman?
6 |
7 | Without mincing words, Newman is:
8 |
9 | > a command-line collection runner for Postman. It allows you to effortlessly run and test a Postman collection directly from the command-line. It is built with extensibility in mind so that you can easily integrate it with your continuous integration servers and build systems.
10 |
11 | The above is taken directly from Newman's [npmjs page](https://www.npmjs.com/package/newman).
12 |
13 | ## Use cases
14 |
15 | Here are some use cases where your utilizing Newman over plain Postman makes sense:
16 |
17 | - Postman limits the amount of traffic you can generate monthly. Our CI/CD services don't usually care about that.
18 | - The Postman monitor cannot easily be integrated with any other pipelines or processes, e.g., backend deployments.
19 | - Sometimes it's more straightforward to fetch a token using Selenium (login via UI) and pass it to Postman. That's not something you can do in Postman directly.
20 | - Sometimes using the CLI to run tests is simply faster.
21 |
22 | ## Installation
23 |
24 | ### Prerequisites
25 |
26 | - Install [node.js & npm](https://nodejs.org/en/download/package-manager/#macos).
27 |
28 | ### Installing Newman
29 |
30 | - Global install: `npm install -g newman`
31 | - Local install: `npm install newman`
32 |
33 | ## Usage as a CLI tool
34 |
35 | ### Running a local collection
36 |
37 | - Navigate to Postman
38 | - Export your collection to a .json file
39 | - Export your environment to a .json file
40 | - Run `newman run collection.json --environment environment.json`
41 |
42 |
43 | ### Running a remote collection
44 |
45 | This option is more interesting because it allows you to make changes in Postman collections and environments without having to manually fetch the aforementioned JSON files.
46 |
47 | Every time your tests run, they will run the latest and the greatest tests you have in your Postman workspace.
48 |
49 | - Navigate to Postman
50 | - Find the collection ID in collection details
51 |
52 | 
53 |
54 | - Find the environment ID in environment details
55 |
56 | 
57 |
58 | - Generate a Postman API key in the "Postman API keys" section of your Postman profile
59 | - Construct a collection URL like so: `https://api.getpostman.com/collections/YOUR_COLLECTION_ID?apikey=YOUR_API_KEY`
60 | - Construct an environment URL like so: `https://api.getpostman.com/environments/YOUR_ENVIRONMENT_ID?apikey=YOUR_API_KEY`
61 | - You can save both to environment variables
62 | - Run `newman run ${COLLECTION_URL} --environment ${ENVIRONMENT_URL}`
63 |
64 | ### Adding a variable to your existing environment
65 |
66 | Let's say you have a Selenium script that fetches the token. You can save that token to an env variable and then forward it to Newman like so:
67 |
68 | - Run `newman run ${COLLECTION_URL} --environment ${ENVIRONMENT_URL} --env-var ${ACCESS_TOKEN_ENV_VAR}`
69 |
70 | ### Sending reports to Slack
71 |
72 | You can also easily send test reports with Slack by simply modifying the aforementioned command:
73 |
74 | - `newman run ${COLLECTION_URL} --environment ${ENVIRONMENT_URL} -r cli,slack --reporter-slack-channel '#your-channel' --reporter-slack-webhook-url '${SLACK_WEBHOOK_URL}' --reporter-slack-title='Test report title'`
75 |
76 | ## Usage as a JS lib
77 |
78 | You can also use Newman as a fully fledged Node.js lib, but we won't go into detail on that particular topic.
79 |
80 | Find more info on the [npmjs page](https://www.npmjs.com/package/newman#using-newman-as-a-library).
81 |
82 | ## Docs
83 |
84 | For more info on all params and other use cases, check out their [GitHub page](https://github.com/postmanlabs/newman).
85 |
--------------------------------------------------------------------------------
/Tools/Using Slack.md:
--------------------------------------------------------------------------------
1 | > Slack works best when everyone in a company uses it to have transparent, informative discussions in channels, which are organized around projects, teams, and disciplines. - [Matt Haughey](https://slack.com/blog/collaboration/etiquette-tips-in-slack)
2 |
3 | ## What's Slack?
4 |
5 | Slack is a great tool that we use every day, but a lot has changed in the last couple of years and this work-from-home situation made Slack usage more frequent and perhaps sometimes a little bit overwhelming.
6 | So here is a guide with a few tips and tricks on how to use Slack to improve and not let it kill your productivity.
7 |
8 | Let's try together to find that sweet spot with just enough communication to stay connected but not enough to kill your focus. :)
9 |
10 | ## How to use Slack?
11 |
12 | ### Prioritize project channels over internal channels and DMs
13 |
14 | - DMs are private and when you ask a question in one, others on your team won't be aware of it. Usually, in all project related questions, there is some useful information that someone sooner or later will benefit from, so please default to the public channel if possible.
15 | - DMs are great for private questions and chat or in case of sensitive information that you don't want everybody else to see. But before sending it, please think if this question or information is perhaps more suitable for the public channel.
16 |
17 | ### Fewer messages by writing longer messages that scan quickly
18 |
19 | - If you decide to send DMs, try not to send a message that just says "hi", "hey" or "hello" and then follow up with a question that you wanted to ask. The person on the other end will receive your notification and probably open the message just to see the indicator that you are typing.
20 | - Writing a longer message with emojis, bullet lists, different types of text is fun, and when well-formatted, the reader can quickly scan through the whole message. This works for DMs and public channels and is especially useful for announcements or meeting recaps.
21 |
22 | ### Use threads to organize conversations on specific topics
23 |
24 | - Using threads can be a lifesaver when asking questions in the channel that will follow up with lots of ideas from other members. Threads will keep the channel organized and clean, without tripping the unread indicator for everyone else in the channel.
25 |
26 | ### Don't be afraid to use emojis
27 |
28 | - When someone writes something in the channel, you can quickly let them know that you have read the message and how you feel about it by reacting with an emoji.
29 | - There are plenty of them and feel free to use them. Emojis can be surprisingly complex for being such a simple tool. They can represent real workflows and some people become masters of emoji storytelling. :)
30 |
31 | ### Use "Do Not Disturb" to carve out focus time and mark outside-of-work hours
32 |
33 | - There is a 'Do Not Disturb' option and don't feel bad about using it when you need it. Like we already said, Slack is here to improve and not kill your productivity.
34 |
35 | ### Organize channels into groups
36 |
37 | - It might be useful for you to organize your channels into sections, especially when you have a lot of them. For example, the group "Project A" would contain all channels related to project A, the group "Project B" all channels related to that one, etc. This makes it easier to track and scan through channels easier and quicker.
38 |
39 | ### Mute or leave unnecessary channels
40 |
41 | - Over time, you will join quite a lot of public and private channels and at one point, you'll realize that maybe it is just too much for you. Feel free to review them and leave the ones that you don't see to have benefit from.
42 |
43 |
44 | *Read more about it in [this Slack article](https://slack.com/blog/collaboration/etiquette-tips-in-slack) by Matt Haughey*
45 |
--------------------------------------------------------------------------------
/Tools/Using Testrail.md:
--------------------------------------------------------------------------------
1 | There are various test case management tools out there. We came to use Gurock Software's Testrail.
2 |
3 | Read up on it [here](https://www.gurock.com/testrail/docs/user-guide).
4 |
5 | ## What is a test suite?
6 |
7 | - A test suite is a set of test cases.
8 | - A test suite may be divided into sections.
9 | - A test case is one test you can execute manually.
10 |
11 | Each project can have several test suites and the scope of the test suite may vary. You might want to test *everything*, or just assemble a test suite that will be used for sanity checks.
12 |
13 | Divide your test suite into digestible sections. One of the best practices is to divide it into features or screens, depending on the type of project you are working on.
14 |
15 | ## How to quickly write & import test cases
16 |
17 | You could find yourself caught in one of the following scenarios:
18 |
19 | - You start working on a project that has no test documentation at all.
20 | - You have very limited time to work on test documentation.
21 | - You already have test documentation in XLSX or CSV and you want to import it into Testrail for easier usage.
22 |
23 | If that is the case, there is an easy way to quickly get yourself up and running:
24 |
25 | - Sketch out your test cases in XLSX/CSV
26 |
27 | 
28 |
29 | - Navigate to your Testrail project
30 | - Click on "Import Cases" and select your file
31 | - Map your columns to Testrail fields
32 |
33 | 
34 |
35 | - Import them and voilà...
36 |
37 | 
38 |
39 | You will quickly and easily get a structure you can build on and immediately start executing tests.
40 |
41 | N.B., if your file does not contain one test case per row, check out the [official user guide](https://www.gurock.com/testrail/docs/user-guide/howto/import-csv).
42 |
43 | ## How to maintain test cases
44 |
45 | - Each time you approach a new task, write test cases for it.
46 | - If it changes some existing behaviour, update the old test cases as well. In that way, you'll always have a set of test cases that actually reflect the app.
47 |
48 | ## Versioning test suites
49 |
50 | If you are working on several app versions at the same time, a good idea is to branch off your current test suite and start maintaining a new one.
51 |
52 | At some point in time, you'll have fresh test cases in the new suite that will not interfere with testing the current version.
53 |
54 | Once the current version becomes deprecated, you can simply discard the old one.
55 |
56 | ## How to run a test suite
57 |
58 | To run a test suite:
59 |
60 | 1. Navigate to Test Runs & Results
61 | 2. Select a test suite
62 | 3. Give the test run a name
63 | 4. Enter the test device, build, environment and other meta data to the description
64 | 5. Exclude some test cases if you agreed to skip them
65 | 6. Add the test run
66 | 7. Go through each test case and assign it a status (Passed, Blocked, Retest, Failed)
67 | 8. Create bugs in your project management tool if you find them and notify the team
68 | 9. Once you are done, close the test run
69 | 10. Generate a test report
70 |
71 | ## How to generate test reports
72 |
73 | here are several different test reports you can generate, here's how you can generate two most used ones.
74 |
75 | **Run summary**
76 |
77 | 1. Navigate to a test run
78 | 2. Click on Run > Summary
79 | 3. Click on Add report
80 | 4. Wait for it to generate
81 | 5. Download it
82 |
83 | **Detailed test report**
84 |
85 | 1. Navigate to a test run
86 | 2. Click on the Print icon
87 | 3. Select "Details" from the top dropdown
88 | 4. Click on Print and save it as a PDF
--------------------------------------------------------------------------------
/Tools/Using TryOutApps.md:
--------------------------------------------------------------------------------
1 | > *He who thinks a tool can solve all problems, has a new problem.*
2 |
3 | ## Installing a build from TryOutApps
4 |
5 | ### Logged in to TryOutApps
6 |
7 | 1. Navigate to [Tryoutapps](https://infinum.tryoutapps.com/) - ***You need to be logged in with your account***
8 | 1. Open up the QR scanner on your phone (on iOS 11 and up, it is built into the Camera app)
9 | 1. Scan the QR code
10 | 1. Install the build
11 |
12 | ### Not logged in to TryOutApps
13 |
14 | The project in TryOutApps has to be set to **“Public”**. If it is not, the developers should create a new project that will be made public.
15 |
16 | - This should be checked with the client, in case the client does not wish the project to be made public, a separate build environment should be created that will be sent via email or other means. For example, if the dev team works on a Staging build, the client or others should receive a Development, UAT, or other environment builds.
17 |
18 | ### Basic steps for iOS and Android
19 |
20 | * Click on the link that you received on your laptop or PC
21 |
22 | If you see **“You are not allowed to visit this page”** at the top of the screen, the project is set to private, and you should contact the person that sent you the URL.
23 |
24 | * Take an Android or iOS device (depending on the version of the app in the link) and scan the QR code that is shown on the page.
25 |
26 | > iOS devices with iOS 11+ and most of the new generation Android devices should have QR scanners built-in with their camera.
27 |
28 | 
29 |
30 | ***If your device does not have a built-in QR scanner***, download an app from the Playstore/Appstore - we recommend and use the **“Barcode Scanner”** app, but any of the offered options should be OK.
31 |
32 | ### Installing on iOS
33 |
34 | * Tap the notification bubble, or the URL shown on the QR scanner to open Infinum TryOutApps in your device browser
35 |
36 | * Tap on the “Install” button **(installation will immediately start on the device)**
37 |
38 | 
39 |
40 | Starting the app on the device you will be prompted to trust the developer of the app once the app has been downloaded. On your device do the following:
41 |
42 | > Open Settings / General / Profiles & Device Management
43 |
44 | You should see our profile under the “Enterprise app” section. Tap it and a modal should appear that asks you “Do you trust this developer?”. Tap on OK.
45 |
46 | ### Installing on Android
47 |
48 | * On Android devices, you need to start the installation.
49 |
50 | > The easiest way to start installation is to tap the notification when the .apk file is downloaded.
51 |
52 | 
53 |
54 | * If the notification is dismissed, open the “Download” folder on the device and tap the .apk found there to start the installation.
55 |
56 | On Android devices, you will need to "trust unknown sources" before installing apps from TryOutApps.
57 |
58 | > Open Settings - Security and check the “Unknown sources” and tap on OK if prompted.
59 |
60 | If you are prompted with **“Blocked by Play Protect”** popup tap on “Install anyway” to install the app.
61 |
--------------------------------------------------------------------------------
/Tools/Using Xcode - Location mocking.md:
--------------------------------------------------------------------------------
1 | > *This is where the quote will be.*
2 |
3 | To setup location simulation you’ll need **Xcode 4.2 or newer**, so make sure you’ve updated your app to that version or beyond. If you don’t have it already, download Xcode it from App store.
4 |
5 | First thing you should do after installing Xcode is to go to Xcode -> Preferences -> Accounts, click on "+" button in the lower left. In a new window select Apple ID, click *Continue* and enter Infinum iCloud account credentials (you can get them in 1password). If you've already done this for previous projects, skip this step.
6 |
7 | 
8 |
9 | After that’s taken care of, you’ll need to download this project on GitHub: https://github.com/andrejivanovic-git/QA_Location_Simulation.
10 | Download the ZIP file and unpack it where it suits you best.
11 |
12 | You should see something like this:
13 |
14 | 
15 |
16 | **Connect your iPhone or iPad to your Macbook** and double-click on *Location_Simulation.xcodeproj*.
17 | Let Xcode to start up and go to **Product -> Scheme -> Edit Scheme** or press Command+Shift+, .
18 | There, make sure the *Allow Location Simulation* checkmark is checked.
19 |
20 | 
21 |
22 | There are several locations you can already choose from, but if you need to import custom locations you’ll need to generate GPX file first.
23 | You can do it on many sites, this one does the trick well enough: http://www.elsewhere.org/journal/gmaptogpx/.
24 | Pick your location on the map in upper left corner, click “Update”, and in the lower right corner name your file and download it in desired format.
25 |
26 | There are two ways to import GPX files to project.
27 | First one is to add it from within *Scheme Editor*: Click the dropdown menu next to *Default Location* and click *Add GPX File to Project…* Navigate to the file and select it and have Xcode copy the file into the destination group’s folder.
28 |
29 | 
30 |
31 | The second one is simply to drag and drop the file(s) to the group in Xcode, as marked in the picture below. In the window that will pop up to the right, check that *Add to targets:* has Location_Simulation selected and click *Finish*.
32 |
33 | 
34 |
35 | Click on dropdown menu to the right of *Play* and *Stop* buttons and select your device. It should be at the top of the drop-down menu. You can click *Play* afterwards. Make sure the device is **unlocked**.
36 |
37 | 
38 |
39 | Xcode should build the project, install the app on your test device and run it automatically. When the process is completed you will see it's icon and name on the screen first, and shortly after the screen will go black - leave it running in the background.
40 |
41 | 
42 |
43 | In Xcode, click blue *Location Simulation* icon (bottom ribbon) and select desired location. On your device, check Apple Maps that your simulated location is displayed, and not the real one.
44 |
45 | 
46 |
47 | It is possible might see **(unsupported family)** next to your device and an error after clicking *Play*:
48 |
49 | 
50 |
51 | 
52 |
53 | In that case, click on **Maps** in the structure tree along the left side of Xcode, you should see what looks like (and are) project settings.
54 |
55 | 
56 |
57 | Find (and expand if needed) *Deployment Info*, this is what you should see:
58 |
59 | 
60 |
61 | There, make sure correct device type is selected (you can have both selected at the same time), and that iOS version selected is older than or at least matches the one on your test device. Save changes with **command + s** and click *Play* again.
62 |
--------------------------------------------------------------------------------
/Tools/Version Control Systems/Access token and SSH keys.md:
--------------------------------------------------------------------------------
1 | > *If I was meant to be controlled, I would have come with a remote control.*
2 |
3 | ## How to generate personal access token
4 |
5 | To make the git commands *pull* / *push* / *clone* work with two-factor authentication (2FA), you need a personal access token which you will then use for authentication when performing *clone* / *pull* / *push* operations, instead of the user password.
6 |
7 | 1. Go to *GitHub*.
8 |
9 | 2. Click the profile image and select *Settings*.
10 |
11 | 3. Select *Developer settings* in the menu on the left-hand side.
12 |
13 | 4. Select *Personal access tokens* in the menu on the left-hand side.
14 |
15 | 5. Click the *Generate new token* button.
16 |
17 | 6. Confirm your GitHub password, if prompted.
18 |
19 | 7. In the 'Note' field, type in the token name.
20 |
21 | 8. Select the *scopes* (permissions) for the access token.
22 | - Select *repo* to have full control of private repositories.
23 |
24 | 9. Click the *Generate token* button.
25 |
26 | 10. Make sure to copy the token because you won’t be able to see it again.
27 |
28 | Source: [https://webkul.com/blog/github-push-with-two-factor-authentication/]()
29 |
30 |
31 |
32 | ## How to use the access token
33 |
34 | 1. Open the terminal and position to a folder in which you want to put your new project (e.g., Documents folder).
35 |
36 | `cd ~/Documents`
37 |
38 | 2. Clone the repository to your machine.
39 |
40 | `git clone https://github.com/username/repository.git`
41 |
42 | 3. Enter your GitHub *username* when prompted.
43 |
44 | 4. Don't use your GitHub password when prompted, instead enter the generated access token.
45 |
46 | 5. Wait for the cloning to finish and continue to work on the project locally.
47 |
48 |
49 | ## How to connect to GitHub using the SSH protocol and ssh-agent
50 |
51 | By default, Git connects to remotes using the HTTPS protocol which requires you to enter your username and password every time you run a command such as *git pull* or *git push*.
52 |
53 | Using the SSH protocol, you can connect and authenticate to remote servers and services. With SSH keys, you can connect to GitHub without supplying your username or password with each visit.
54 |
55 | First, check whether you have any existing SSH keys. To do this, open the terminal and enter
56 |
57 | `ls -al ~/.ssh`
58 |
59 | If you don't have an existing public and private key pair, then generate a new SSH key.
60 |
61 | 1. Open the terminal.
62 |
63 | 2. Create a new SSH key with the provided email as a label by running the following command (substituting in your GitHub email address):
64 |
65 | `ssh-keygen -t ed25519 -C "your_email@example.com"`
66 |
67 | 3. Press Enter when prompted to "*Enter a file in which to save the key*" to accept the default file location.
68 |
69 | 4. Enter a secure passphrase when prompted.
70 |
71 |
72 | ### How to add SSH key to ssh-agent
73 |
74 | If you don't want to re-enter your passphrase every time you use your SSH key, you can add your key to the ssh-agent (a helper program that runs in the background while you are logged in to the system and manages your SSH keys and their passphrases).
75 |
76 | 1. Start the ssh-agent in the background
77 |
78 | `eval "$(ssh-agent -s)"`
79 |
80 | The command outputs the ssh-agent process identifier:
81 |
82 | `> Agent pid 59566`
83 |
84 | 2. If you're using macOS Sierra 10.12.2 or later, you will need to modify your `~/.ssh/config` file to automatically load keys into the ssh-agent and store passphrases in your keychain:
85 |
86 | ```
87 | Host *
88 | AddKeysToAgent yes
89 | UseKeychain yes
90 | IdentityFile ~/.ssh/id_ed25519
91 | ```
92 |
93 | 3. Add your SSH private key to the ssh-agent and store your passphrase in the keychain. If you created your key with a different name, or if you are adding an existing key that has a different name, replace `id_ed25519` in the command with the name of your private key file:
94 |
95 | `ssh-add --apple-use-keychain ~/.ssh/id_ed25519`
96 |
97 | 4. Enter the passphrase to add your identity.
98 |
99 | 5. Add the SSH key to your GitHub account (see "How to add SSH key to your GitHub account").
100 |
101 |
102 | ### How to add SSH key to your GitHub account
103 |
104 | To configure your GitHub account to use your new (or existing) SSH key, you'll also need to add it to your GitHub account (after adding a new SSH key to your GitHub account, you can reconfigure any local repositories to use SSH).
105 |
106 | 1. Open the terminal and run the following command to copy the SSH key to your clipboard (make sure that you don’t copy any whitespace while copying the public key’s content):
107 |
108 | `pbcopy < ~/.ssh/id_ed25519.pub`
109 |
110 | 2. Open *Settings* on your GitHub page.
111 |
112 | 3. Select *SSH and GPG keys* in the menu on the left-hand side.
113 |
114 | 4. Click the *New SSH key* button.
115 |
116 | 5. In the 'Title' field type in a descriptive label for the new key. For example, if you're using your work Mac, you could call it "*work-Mac*".
117 |
118 | 6. In the 'Key' field, paste your SSH key.
119 |
120 | 7. Click the *Add SSH key* button.
121 |
122 | 8. Confirm your GitHub password, if prompted.
123 |
--------------------------------------------------------------------------------
/Tools/Version Control Systems/Code management.md:
--------------------------------------------------------------------------------
1 |
2 | A version control system is used for managing your source code. One of those systems is `git`.
3 |
4 | When working on a project, you most likely won't work alone but with a team. In that case, you want to make the collaboration as effortless as possible.
5 | This is where a repository hosting service comes in handy.
6 |
7 | A repository hosting service is a platform used for storing your source code which you can then share with others.
8 | Those services are usually saved somewhere in the cloud. Besides just acting as a repository, the platforms offer additional features, such as project management and bug tracking.
9 |
10 | There are various hosting service solutions to choose from, some of which are:
11 |
12 | * [GitHub](https://github.com)
13 | * [GitLab](https://about.gitlab.com)
14 | * [Bitbucket](https://bitbucket.org/product)
15 | * [SourceForge](https://sourceforge.net)
16 |
17 |
18 | ## Basic workflow on GitHub
19 |
20 | ### How to create a new repository
21 |
22 | The following steps will help you create an initialized GitHub repository with a README file included. By default, GitHub creates a single branch named *main*.
23 |
24 | 1. Log in to **GitHub**
25 |
26 | 2. Click the **+** button next to your profile image and select **New repository**
27 |
28 | 3. Type in the repository name
29 |
30 | 4. Choose the **visibility** of the repository by selecting *Public* or *Private*
31 | - *Public* repositories are visible to everyone so think twice before pushing anything to it
32 | - *Private* repositories are only accessible to you and the people you share them with
33 |
34 | 5. In the *Initialize this repository with* section, select the **Add a README file** checkbox
35 | - It is a good idea to include a README file containing information about the project
36 |
37 | 6. Click the **Create Repository** button
38 |
39 |
40 | ### How to clone a repository
41 | Cloning a GitHub repository creates a local copy of that remote repository. The following steps show how to clone a remote repository and create an initialized local repository on your machine.
42 |
43 | 1. Go to **GitHub** and open the repository’s page
44 |
45 | 2. Click the **Code** button to expand the dropdown menu
46 |
47 | 3. Select the desired option, e.g. SSH, and **copy** the **URL**
48 | - **NOTE**: If you already have 2FA enabled and try to clone the repository using the HTTPS option, you might run into the '*Authentication failed*' issue
49 |
50 | 4. Open the terminal on your machine and position to a folder in which you want to put your new project (e.g. Documents folder)
51 |
52 | `cd ~/Documents`
53 |
54 | 5. **Clone** the repository to your machine
55 |
56 | `git clone git@github.com:username/repository.git`
57 |
58 | 6. When prompted, enter your GitHub **username** / **password** or passphrase, depending on the selected cloning option (HTTPS or SSH)
59 |
60 | 7. **Change** the current working directory to the newly created **directory**
61 |
62 | `cd repository`
--------------------------------------------------------------------------------
/Tools/Version Control Systems/Using Git - Advanced.md:
--------------------------------------------------------------------------------
1 | > *You can see a lot by just looking.*
2 |
3 | ## How to change remote repository URL
4 | Let’s say you want to clone someone's GitHub repository but wish to continue pushing the changes to a new (your) remote repository.
5 | Use the `git remote set-url` command to change your remote’s URL.
6 |
7 | 1. Clone a repository to your machine
8 |
9 | `git clone https://github.com/username/repository.git`
10 |
11 | 2. Create a new GitHub repository
12 |
13 | 3. Open the terminal and change the current working directory to your local project
14 |
15 | `cd repository`
16 |
17 | 4. Change your remote's URL
18 | - If updating to HTTPS:
19 |
20 | `git remote set-url origin https://github.com/USERNAME/REPOSITORY.git`
21 | - If updating to SSH:
22 |
23 | `git remote set-url origin git@github.com:USERNAME/REPOSITORY.git`
24 |
25 | 5. Verify that the remote URL has changed
26 |
27 | `git remote -v`
28 |
29 | 6. Stage, commit and push :)
30 |
31 |
32 | ## Working with branches
33 | Every project starts with the main branch, i.e. a main line of development. Sometimes you may want to try something out, have another version of your work or start working on a new feature and have it separate from the main. This is where branching comes in handy.
34 |
35 | By creating a branch you are creating an independent line of development in which you can continue your work without having to fear messing something up in the main branch.
36 | Branching is a common practice among developers when introducing a new feature or updating the existing ones.
37 |
38 | 
39 |
40 |
41 | ### How to switch branches
42 |
43 | Let’s say a project already exists, and you want to pull the updates and continue working on one of the branches.
44 |
45 | 1. Open the terminal and position to your project
46 |
47 | `cd repository`
48 |
49 | 2. Pull the updates from the remote repository
50 |
51 | `git pull`
52 |
53 | 3. Change into the existing branch called `feature-1`
54 |
55 | `git checkout feature-1`
56 |
57 | 4. Make the changes to files
58 |
59 | 5. Stage, commit and push :)
60 |
61 |
62 | ### How to create a new branch
63 | There are multiple ways to create a new branch. This example shows how to create a new branch from the branch you are currently at.
64 |
65 | 1. Open the terminal and position to your project
66 |
67 | `cd repository`
68 |
69 | 2. Create a new branch called ‘*feature-abc*’ from the branch you are currently at
70 |
71 | `git branch feature-abc`
72 |
73 | 3. View the branches on your local machine
74 |
75 | `git branch`
76 |
77 | 4. Switch to the newly created branch
78 |
79 | `git checkout feature-abc`
80 |
81 | 5. Edit, stage and commit your files
82 |
83 | 6. Push the new local branch to the remote repository
84 |
85 | `git push`
86 |
87 |
88 | ### How to merge branches
89 | To merge branches means to join their development histories together, i.e. to integrate the branch you worked on back into the branch from which it was created.
90 |
91 | For example, you created a new branch from the main branch and after you committed the changes and made sure everything works, you want to merge it into the main.
92 |
93 | Note that `git merge` merges the specified branch into the currently active one. If you want to merge into the main branch, you have to be on the main branch.
94 |
95 | 1. Open the terminal and position to your project
96 |
97 | `cd repository`
98 |
99 | 2. View the branches and make sure that you are on the *main* branch
100 |
101 | `git branch`
102 |
103 | 3. Merge the branch into the main branch
104 |
105 | `git merge feature-abc`
106 |
107 |
108 | ## How to create a pull request (GitHub)
109 |
110 | A pull request is a way of notifying the collaborators on the project about the changes. Those changes can then be reviewed before being integrated into the main branch.
111 |
112 | 1. Go to GitHub and open the repository’s main page
113 |
114 | 2. From the branch dropdown menu in the upper left corner, select the branch that contains your commits
115 |
116 | 
117 |
118 | 3. Click *Pull request* (on the right-hand side of the greyed-out box)
119 |
120 | 4. In the *base: [branch-name]* dropdown menu select the branch into which you'd like to merge your changes
121 |
122 | 5. In the *compare: [branch-name]* dropdown menu choose the branch containing your changes
123 |
124 | 
125 |
126 | 6. Type in a title and comment for the pull request
127 |
128 | 7. Click the *Create Pull Request* button
129 |
--------------------------------------------------------------------------------
/Tools/Version Control Systems/Using Git - Basics.md:
--------------------------------------------------------------------------------
1 | > *Fellow testers, we cannot not to find bugs.*
2 |
3 | ## What is git?
4 | Git is a **Version Control System** (VCS). There are various version control systems, but `git` is by far the most popular one, both for individual and company use. On a very basic level, there are a couple of awesome things a VCS offers:
5 |
6 | - tracking changes in your files
7 |
8 | - the option to revert to a previous version
9 |
10 | - simplified collaboration on files and projects with other people
11 |
12 |
13 | You should already have `git` installed on your Mac. To check the version, run the following command in the terminal:
14 |
15 | `git --version`
16 |
17 | In case you don’t have it installed, the command above will also start the installation the first time you run it.
18 |
19 |
20 | ## Terminology
21 |
22 | **Repository** (often called _repo_) is a location where your files and folders are stored.
23 |
24 | **Origin** is the name of the originally cloned remote repository. The name *origin* is used instead of the repository's URL for easier referencing.
25 |
26 | **Main** is the name of the default branch that git creates when first creating a repository. In most cases, *main* means the *main branch*.
27 | Sometimes you might hear or read about the *master branch*, which is the old default branch name that you can still see in some older projects.
28 |
29 | The names *main* and *origin* are a standard convention and don't have a special meaning. Although they can be renamed to whatever you want, it’s better to leave them as it is.
30 |
31 |
32 | ## Basic git commands
33 |
34 | `git init` initializes a git repository. It can be used to create a new repository or to convert an existing directory into a git repository
35 |
36 | `git clone` creates a local copy of a remote repository
37 |
38 | `git branch` creates, lists or deletes branches (depending on the option it is used with)
39 |
40 | `git add` prepares changes for commit, i.e. tells git which file(s) you want to include in the following commit
41 |
42 | `git commit` saves the changes to your local repository. Think of it like clicking the Save button
43 |
44 | `git status` shows the status of modified files
45 |
46 | `git pull` updates your local files by downloading content from the remote repository. You use it when a team member has made commits to a branch on a remote repository, and you want to add those changes to your local environment
47 |
48 | `git push` sends the changes (commits) made locally to the remote repository
49 |
50 | `git merge` joins two or more branches together
51 |
52 | 
53 |
54 |
55 | ## How to stage, commit and push changes
56 |
57 | Once you have a local copy of the remote repository on your machine, you can start working on it.
58 | The first thing you want to do is create a new line of development, that is, create a _new branch_ on which you will work (for more information on branches, check [Using Git - Advanced](https://infinum.com/handbook/qa/tools/version-control-systems/using-git-advanced)).
59 | Afterwards, you can make the changes to your files, stage them, commit and push to the remote repository.
60 |
61 | 1. Create a **new branch** that will store your changes
62 |
63 | `git branch my-branch`
64 |
65 | 2. **Switch** to the newly created **branch**
66 |
67 | `git checkout my-branch`
68 |
69 | 3. Make the changes, e.g. edit files file1.md and file2.md
70 |
71 | 4. **Stage** the modified files
72 | - To stage a single file
73 |
74 | `git add file1.md`
75 | - To stage all modified files
76 |
77 | `git add .`
78 |
79 | 5. Check the **status** of the staged files
80 |
81 | `git status`
82 |
83 | 6. **Commit** the changes (with an easy-to-understand message)
84 |
85 | `git commit -m "Add method-abc"`
86 |
87 | 7. **Push** the changes to the remote repository
88 |
89 | `git push --set-upstream origin my-branch`
90 |
91 | `git push --set-upstream origin my-branch` configures the relationship between the remote and your local repository when you push the changes for the first time.
92 | Later, you can simply use `git pull` and `git push`.
93 |
94 |
95 | This is how a complete workflow would look like:
96 |
97 | 
98 |
99 | ## Additional resources
100 |
101 | - [Learn GIT branching](https://learngitbranching.js.org)
102 | - [GIT command explorer](https://gitexplorer.com)
103 |
--------------------------------------------------------------------------------
/img/0_EEhV9BlXgsTFnBW8 (1).gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/0_EEhV9BlXgsTFnBW8 (1).gif
--------------------------------------------------------------------------------
/img/0_EEhV9BlXgsTFnBW8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/0_EEhV9BlXgsTFnBW8.gif
--------------------------------------------------------------------------------
/img/0_ISI_huTLMe899JVq.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/0_ISI_huTLMe899JVq.gif
--------------------------------------------------------------------------------
/img/0_bYF8loGdnpHklSKS.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/0_bYF8loGdnpHklSKS.gif
--------------------------------------------------------------------------------
/img/1_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/1_battery.png
--------------------------------------------------------------------------------
/img/2_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/2_battery.png
--------------------------------------------------------------------------------
/img/3_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/3_battery.png
--------------------------------------------------------------------------------
/img/4_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/4_battery.png
--------------------------------------------------------------------------------
/img/5_battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/5_battery.png
--------------------------------------------------------------------------------
/img/Activity_Indicator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Activity_Indicator.png
--------------------------------------------------------------------------------
/img/Android_Studio-Run_and_Profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_Studio-Run_and_Profile.png
--------------------------------------------------------------------------------
/img/Android_Studio-add_no_activity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_Studio-add_no_activity.png
--------------------------------------------------------------------------------
/img/Android_Studio-configure_your_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_Studio-configure_your_project.png
--------------------------------------------------------------------------------
/img/Android_Studio-connected_device.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_Studio-connected_device.png
--------------------------------------------------------------------------------
/img/Android_Studio-start_new_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_Studio-start_new_project.png
--------------------------------------------------------------------------------
/img/Android_studio-Profiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Android_studio-Profiler.png
--------------------------------------------------------------------------------
/img/Backdrop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Backdrop.png
--------------------------------------------------------------------------------
/img/Banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Banner.png
--------------------------------------------------------------------------------
/img/Bottom_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Bottom_Bar.png
--------------------------------------------------------------------------------
/img/Bottom_Navigation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Bottom_Navigation.png
--------------------------------------------------------------------------------
/img/Breadcrumb_navigation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Breadcrumb_navigation.png
--------------------------------------------------------------------------------
/img/Builder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Builder.png
--------------------------------------------------------------------------------
/img/CSS-Accordion-Menu-with-Tooltip.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/CSS-Accordion-Menu-with-Tooltip.gif
--------------------------------------------------------------------------------
/img/CTA_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/CTA_button.png
--------------------------------------------------------------------------------
/img/Cards.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Cards.png
--------------------------------------------------------------------------------
/img/Chips.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Chips.png
--------------------------------------------------------------------------------
/img/Collections-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Collections-1.png
--------------------------------------------------------------------------------
/img/Comparison_Table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Comparison_Table.png
--------------------------------------------------------------------------------
/img/Console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Console.png
--------------------------------------------------------------------------------
/img/Cookies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Cookies.png
--------------------------------------------------------------------------------
/img/Date_Picker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Date_Picker.png
--------------------------------------------------------------------------------
/img/Dialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Dialog.png
--------------------------------------------------------------------------------
/img/Divider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Divider.png
--------------------------------------------------------------------------------
/img/Exploratory_Testing_QR_code_scanner_steps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Exploratory_Testing_QR_code_scanner_steps.png
--------------------------------------------------------------------------------
/img/Fixed_Menu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Fixed_Menu.gif
--------------------------------------------------------------------------------
/img/Fixed_Sidebar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Fixed_Sidebar.gif
--------------------------------------------------------------------------------
/img/Floating_Action_Button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Floating_Action_Button.png
--------------------------------------------------------------------------------
/img/Full_Page_Tabs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Full_Page_Tabs.gif
--------------------------------------------------------------------------------
/img/Fullscreen_Navigation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Fullscreen_Navigation.gif
--------------------------------------------------------------------------------
/img/Fullscreen_Search.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Fullscreen_Search.gif
--------------------------------------------------------------------------------
/img/Heuristics_Cheat_Sheet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Heuristics_Cheat_Sheet.png
--------------------------------------------------------------------------------
/img/Hover_Tabs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Hover_Tabs.gif
--------------------------------------------------------------------------------
/img/Image_List.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Image_List.png
--------------------------------------------------------------------------------
/img/Image_Overlay_Title.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Image_Overlay_Title.gif
--------------------------------------------------------------------------------
/img/Installbutton.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Installbutton.jpg
--------------------------------------------------------------------------------
/img/JIRA_test_plan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/JIRA_test_plan.jpg
--------------------------------------------------------------------------------
/img/Lists.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Lists.png
--------------------------------------------------------------------------------
/img/Loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Loader.gif
--------------------------------------------------------------------------------
/img/M1_iphone_Apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/M1_iphone_Apps.png
--------------------------------------------------------------------------------
/img/Modal_Box.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Modal_Box.gif
--------------------------------------------------------------------------------
/img/Modal_Images.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Modal_Images.gif
--------------------------------------------------------------------------------
/img/Navigation-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Navigation-2.png
--------------------------------------------------------------------------------
/img/Navigation_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Navigation_Bar.png
--------------------------------------------------------------------------------
/img/Navigation_Bar_Title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Navigation_Bar_Title.png
--------------------------------------------------------------------------------
/img/OWASP_ZAP_2-7-0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/OWASP_ZAP_2-7-0.png
--------------------------------------------------------------------------------
/img/Off-Canvas Menu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Off-Canvas Menu.gif
--------------------------------------------------------------------------------
/img/Offline_mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Offline_mode.png
--------------------------------------------------------------------------------
/img/Overlay_Effect.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Overlay_Effect.gif
--------------------------------------------------------------------------------
/img/Page_Control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Page_Control.png
--------------------------------------------------------------------------------
/img/Pagination.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Pagination.png
--------------------------------------------------------------------------------
/img/Popover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Popover.png
--------------------------------------------------------------------------------
/img/Popup-onclick.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Popup-onclick.gif
--------------------------------------------------------------------------------
/img/Postman_2x_tests.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_2x_tests.png
--------------------------------------------------------------------------------
/img/Postman_expected_result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_expected_result.png
--------------------------------------------------------------------------------
/img/Postman_first_20_pokemons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_first_20_pokemons.png
--------------------------------------------------------------------------------
/img/Postman_flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_flow.png
--------------------------------------------------------------------------------
/img/Postman_status200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_status200.png
--------------------------------------------------------------------------------
/img/Postman_test_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_test_code.png
--------------------------------------------------------------------------------
/img/Postman_test_fail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_test_fail.png
--------------------------------------------------------------------------------
/img/Postman_test_request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_test_request.png
--------------------------------------------------------------------------------
/img/Postman_tests_success.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_tests_success.png
--------------------------------------------------------------------------------
/img/Postman_variable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_variable.png
--------------------------------------------------------------------------------
/img/Postman_variable_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Postman_variable_code.png
--------------------------------------------------------------------------------
/img/Progress_Bar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Progress_Bar.gif
--------------------------------------------------------------------------------
/img/Proxyman_brakepoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_brakepoint.png
--------------------------------------------------------------------------------
/img/Proxyman_brakepoint_rules.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_brakepoint_rules.png
--------------------------------------------------------------------------------
/img/Proxyman_charts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_charts.png
--------------------------------------------------------------------------------
/img/Proxyman_crtificate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_crtificate.png
--------------------------------------------------------------------------------
/img/Proxyman_example_chart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_example_chart.png
--------------------------------------------------------------------------------
/img/Proxyman_rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_rule.png
--------------------------------------------------------------------------------
/img/Proxyman_rule_draft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_rule_draft.png
--------------------------------------------------------------------------------
/img/Proxyman_value_89.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Proxyman_value_89.png
--------------------------------------------------------------------------------
/img/QARK_apk_path.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/QARK_apk_path.png
--------------------------------------------------------------------------------
/img/Range_Sliders.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Range_Sliders.gif
--------------------------------------------------------------------------------
/img/Response_Box-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Response_Box-1.png
--------------------------------------------------------------------------------
/img/Scope_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Scope_Bar.png
--------------------------------------------------------------------------------
/img/Scroll_Indicator.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Scroll_Indicator.gif
--------------------------------------------------------------------------------
/img/Search_Bar_iOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Search_Bar_iOS.png
--------------------------------------------------------------------------------
/img/Search_Bar_web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Search_Bar_web.png
--------------------------------------------------------------------------------
/img/Section_Counter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Section_Counter.png
--------------------------------------------------------------------------------
/img/Side_Navigation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Side_Navigation.gif
--------------------------------------------------------------------------------
/img/Slider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Slider.png
--------------------------------------------------------------------------------
/img/Slideshow_Carousel.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Slideshow_Carousel.gif
--------------------------------------------------------------------------------
/img/Smooth_Scroll.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Smooth_Scroll.gif
--------------------------------------------------------------------------------
/img/Snackbar_Toast.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Snackbar_Toast.gif
--------------------------------------------------------------------------------
/img/Snackbars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Snackbars.png
--------------------------------------------------------------------------------
/img/Star_Rating.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Star_Rating.png
--------------------------------------------------------------------------------
/img/Status_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Status_Bar.png
--------------------------------------------------------------------------------
/img/Stepper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Stepper.png
--------------------------------------------------------------------------------
/img/Sticky_Navbar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Sticky_Navbar.gif
--------------------------------------------------------------------------------
/img/Sticky_Social_Bar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Sticky_Social_Bar.gif
--------------------------------------------------------------------------------
/img/Style.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Style.png
--------------------------------------------------------------------------------
/img/Switch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Switch.png
--------------------------------------------------------------------------------
/img/Tab_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tab_Bar.png
--------------------------------------------------------------------------------
/img/Tab_Headers.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tab_Headers.gif
--------------------------------------------------------------------------------
/img/Tabs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tabs.gif
--------------------------------------------------------------------------------
/img/Tabs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tabs.png
--------------------------------------------------------------------------------
/img/Testing_Prereleases_Report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Testing_Prereleases_Report.png
--------------------------------------------------------------------------------
/img/Testing_Prereleases_TestRail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Testing_Prereleases_TestRail.png
--------------------------------------------------------------------------------
/img/Testrail_test_case.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Testrail_test_case.jpg
--------------------------------------------------------------------------------
/img/Testrail_test_report.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Testrail_test_report.jpg
--------------------------------------------------------------------------------
/img/Toggle_Switch.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Toggle_Switch.gif
--------------------------------------------------------------------------------
/img/Toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Toolbar.png
--------------------------------------------------------------------------------
/img/Tooltips.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tooltips.gif
--------------------------------------------------------------------------------
/img/Tooltips.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Tooltips.png
--------------------------------------------------------------------------------
/img/Top_Bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Top_Bar.png
--------------------------------------------------------------------------------
/img/Top_Navigation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Top_Navigation.gif
--------------------------------------------------------------------------------
/img/UI-design-elements.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/UI-design-elements.png
--------------------------------------------------------------------------------
/img/Vertical_Tabs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Vertical_Tabs.gif
--------------------------------------------------------------------------------
/img/WS-manage-environment65.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/WS-manage-environment65.png
--------------------------------------------------------------------------------
/img/Xray_test_case.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Xray_test_case.jpg
--------------------------------------------------------------------------------
/img/Xray_test_report.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/Xray_test_report.jpg
--------------------------------------------------------------------------------
/img/adding_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/adding_icon.png
--------------------------------------------------------------------------------
/img/adding_new_content.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/adding_new_content.png
--------------------------------------------------------------------------------
/img/agile-quadrant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/agile-quadrant.png
--------------------------------------------------------------------------------
/img/android_proxy_setup.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/android_proxy_setup.gif
--------------------------------------------------------------------------------
/img/android_studio_sdk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/android_studio_sdk.png
--------------------------------------------------------------------------------
/img/appbot-reviews.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/appbot-reviews.png
--------------------------------------------------------------------------------
/img/appbot-slack-review.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/appbot-slack-review.png
--------------------------------------------------------------------------------
/img/appmon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/appmon.png
--------------------------------------------------------------------------------
/img/artifact1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact1.png
--------------------------------------------------------------------------------
/img/artifact2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact2.png
--------------------------------------------------------------------------------
/img/artifact3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact3.png
--------------------------------------------------------------------------------
/img/artifact4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact4.png
--------------------------------------------------------------------------------
/img/artifact5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact5.png
--------------------------------------------------------------------------------
/img/artifact6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact6.png
--------------------------------------------------------------------------------
/img/artifact7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/artifact7.png
--------------------------------------------------------------------------------
/img/block.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/block.png
--------------------------------------------------------------------------------
/img/book-business-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-business-rule.png
--------------------------------------------------------------------------------
/img/book-cases.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-cases.png
--------------------------------------------------------------------------------
/img/book-idea-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-1.png
--------------------------------------------------------------------------------
/img/book-idea-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-2.png
--------------------------------------------------------------------------------
/img/book-idea-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-3.png
--------------------------------------------------------------------------------
/img/book-idea-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-4.png
--------------------------------------------------------------------------------
/img/book-idea-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-5.png
--------------------------------------------------------------------------------
/img/book-idea-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-idea-6.png
--------------------------------------------------------------------------------
/img/book-input-output.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-input-output.png
--------------------------------------------------------------------------------
/img/book-intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/book-intro.png
--------------------------------------------------------------------------------
/img/browser-list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/browser-list.png
--------------------------------------------------------------------------------
/img/bug_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/bug_example.png
--------------------------------------------------------------------------------
/img/bva.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/bva.png
--------------------------------------------------------------------------------
/img/case.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/case.jpg
--------------------------------------------------------------------------------
/img/cd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/cd.jpg
--------------------------------------------------------------------------------
/img/charles-set-up-host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/charles-set-up-host.png
--------------------------------------------------------------------------------
/img/collection-runner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/collection-runner.png
--------------------------------------------------------------------------------
/img/common_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_1.png
--------------------------------------------------------------------------------
/img/common_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_2.png
--------------------------------------------------------------------------------
/img/common_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_3.png
--------------------------------------------------------------------------------
/img/common_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_4.png
--------------------------------------------------------------------------------
/img/common_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_5.png
--------------------------------------------------------------------------------
/img/common_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_6.png
--------------------------------------------------------------------------------
/img/common_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_7.png
--------------------------------------------------------------------------------
/img/common_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/common_8.png
--------------------------------------------------------------------------------
/img/continuum.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/continuum.jpg
--------------------------------------------------------------------------------
/img/design_review_in_excel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/design_review_in_excel.png
--------------------------------------------------------------------------------
/img/designreview_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/designreview_15.png
--------------------------------------------------------------------------------
/img/designreview_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/designreview_16.png
--------------------------------------------------------------------------------
/img/designreview_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/designreview_17.png
--------------------------------------------------------------------------------
/img/ed.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/ed.jpg
--------------------------------------------------------------------------------
/img/editing_content.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/editing_content.png
--------------------------------------------------------------------------------
/img/eightshift_form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/eightshift_form.png
--------------------------------------------------------------------------------
/img/exp-vs-for.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/exp-vs-for.png
--------------------------------------------------------------------------------
/img/file_update.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/file_update.png
--------------------------------------------------------------------------------
/img/firefox_offline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/firefox_offline.png
--------------------------------------------------------------------------------
/img/git_branches.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_branches.jpg
--------------------------------------------------------------------------------
/img/git_choose_branches_PR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_choose_branches_PR.png
--------------------------------------------------------------------------------
/img/git_conflicts_conflict.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_conflict.png
--------------------------------------------------------------------------------
/img/git_conflicts_resolve_conflict_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_resolve_conflict_1.png
--------------------------------------------------------------------------------
/img/git_conflicts_resolve_conflict_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_resolve_conflict_2.png
--------------------------------------------------------------------------------
/img/git_conflicts_resolve_conflict_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_resolve_conflict_3.png
--------------------------------------------------------------------------------
/img/git_conflicts_resolve_conflict_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_resolve_conflict_4.png
--------------------------------------------------------------------------------
/img/git_conflicts_resolved.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_conflicts_resolved.png
--------------------------------------------------------------------------------
/img/git_pull_request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_pull_request.png
--------------------------------------------------------------------------------
/img/git_workflow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_workflow.jpg
--------------------------------------------------------------------------------
/img/git_workflow_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/git_workflow_example.png
--------------------------------------------------------------------------------
/img/googleRequest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/googleRequest.png
--------------------------------------------------------------------------------
/img/gutenberg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/gutenberg.png
--------------------------------------------------------------------------------
/img/header-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/header-2.png
--------------------------------------------------------------------------------
/img/html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/html.png
--------------------------------------------------------------------------------
/img/iOS_QR_Camera.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/iOS_QR_Camera.jpg
--------------------------------------------------------------------------------
/img/inspectElement.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/inspectElement.png
--------------------------------------------------------------------------------
/img/inspector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/inspector.png
--------------------------------------------------------------------------------
/img/install_apk.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/install_apk.jpg
--------------------------------------------------------------------------------
/img/instruments_choose_profiling_template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_choose_profiling_template.png
--------------------------------------------------------------------------------
/img/instruments_detail_pane.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_detail_pane.png
--------------------------------------------------------------------------------
/img/instruments_inspector_pane_navigation_bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_inspector_pane_navigation_bar.png
--------------------------------------------------------------------------------
/img/instruments_profiling_dialog_target.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_profiling_dialog_target.png
--------------------------------------------------------------------------------
/img/instruments_profiling_dialog_template_choice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_profiling_dialog_template_choice.png
--------------------------------------------------------------------------------
/img/instruments_trace_document.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_trace_document.png
--------------------------------------------------------------------------------
/img/instruments_trace_document_timeline_pane.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_trace_document_timeline_pane.png
--------------------------------------------------------------------------------
/img/instruments_trace_document_toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/instruments_trace_document_toolbar.png
--------------------------------------------------------------------------------
/img/ios_proxy_setup.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/ios_proxy_setup.gif
--------------------------------------------------------------------------------
/img/jenkins_build_history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jenkins_build_history.png
--------------------------------------------------------------------------------
/img/jenkins_build_now.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jenkins_build_now.png
--------------------------------------------------------------------------------
/img/jenkins_console_output.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jenkins_console_output.png
--------------------------------------------------------------------------------
/img/jenkins_plugins_html_publisher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jenkins_plugins_html_publisher.png
--------------------------------------------------------------------------------
/img/jenkins_scan_multibranch_pipeline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jenkins_scan_multibranch_pipeline.png
--------------------------------------------------------------------------------
/img/jira_article_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_1.png
--------------------------------------------------------------------------------
/img/jira_article_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_2.png
--------------------------------------------------------------------------------
/img/jira_article_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_3.png
--------------------------------------------------------------------------------
/img/jira_article_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_4.png
--------------------------------------------------------------------------------
/img/jira_article_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_5.png
--------------------------------------------------------------------------------
/img/jira_article_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_6.png
--------------------------------------------------------------------------------
/img/jira_article_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_7.png
--------------------------------------------------------------------------------
/img/jira_article_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_8.png
--------------------------------------------------------------------------------
/img/jira_article_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jira_article_9.png
--------------------------------------------------------------------------------
/img/jmeter-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/jmeter-example.png
--------------------------------------------------------------------------------
/img/lighthouse-diagnostics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/lighthouse-diagnostics.png
--------------------------------------------------------------------------------
/img/lighthouse-report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/lighthouse-report.png
--------------------------------------------------------------------------------
/img/lighthouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/lighthouse.png
--------------------------------------------------------------------------------
/img/live-app-load.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/live-app-load.png
--------------------------------------------------------------------------------
/img/live-app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/live-app.png
--------------------------------------------------------------------------------
/img/loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/loading.png
--------------------------------------------------------------------------------
/img/location1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location1.png
--------------------------------------------------------------------------------
/img/location10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location10.png
--------------------------------------------------------------------------------
/img/location11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location11.png
--------------------------------------------------------------------------------
/img/location15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location15.png
--------------------------------------------------------------------------------
/img/location1a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location1a.png
--------------------------------------------------------------------------------
/img/location2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location2.png
--------------------------------------------------------------------------------
/img/location3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location3.png
--------------------------------------------------------------------------------
/img/location4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location4.png
--------------------------------------------------------------------------------
/img/location4a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location4a.png
--------------------------------------------------------------------------------
/img/location5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location5.png
--------------------------------------------------------------------------------
/img/location5a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location5a.png
--------------------------------------------------------------------------------
/img/location6.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location6.jpeg
--------------------------------------------------------------------------------
/img/location6a.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location6a.jpeg
--------------------------------------------------------------------------------
/img/location7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location7.png
--------------------------------------------------------------------------------
/img/location8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location8.png
--------------------------------------------------------------------------------
/img/location9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/location9.png
--------------------------------------------------------------------------------
/img/locators_android.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/locators_android.png
--------------------------------------------------------------------------------
/img/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/login.png
--------------------------------------------------------------------------------
/img/mobile-browser-list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/mobile-browser-list.png
--------------------------------------------------------------------------------
/img/network-headers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/network-headers.png
--------------------------------------------------------------------------------
/img/network-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/network-request.png
--------------------------------------------------------------------------------
/img/network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/network.png
--------------------------------------------------------------------------------
/img/objection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/objection.png
--------------------------------------------------------------------------------
/img/products.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/products.png
--------------------------------------------------------------------------------
/img/project-methodologies.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/project-methodologies.jpg
--------------------------------------------------------------------------------
/img/proxyman1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/proxyman1.png
--------------------------------------------------------------------------------
/img/report_path_qark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/report_path_qark.png
--------------------------------------------------------------------------------
/img/requestStatus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/requestStatus.png
--------------------------------------------------------------------------------
/img/responsive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/responsive.png
--------------------------------------------------------------------------------
/img/root-cause.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/root-cause.png
--------------------------------------------------------------------------------
/img/scrum-ceremonies.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/scrum-ceremonies.jpg
--------------------------------------------------------------------------------
/img/scrum-sprint.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/scrum-sprint.jpg
--------------------------------------------------------------------------------
/img/scrum-team.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/scrum-team.png
--------------------------------------------------------------------------------
/img/scrum-vs-kanban.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/scrum-vs-kanban.png
--------------------------------------------------------------------------------
/img/sections.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/sections.jpg
--------------------------------------------------------------------------------
/img/selenium_locators_css_devtools_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/selenium_locators_css_devtools_1.png
--------------------------------------------------------------------------------
/img/selenium_locators_css_devtools_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/selenium_locators_css_devtools_2.png
--------------------------------------------------------------------------------
/img/selenium_locators_xpath_devtools_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/selenium_locators_xpath_devtools_1.png
--------------------------------------------------------------------------------
/img/selenium_locators_xpath_devtools_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/selenium_locators_xpath_devtools_2.png
--------------------------------------------------------------------------------
/img/some_commands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/some_commands.png
--------------------------------------------------------------------------------
/img/st-qc-qa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/st-qc-qa.png
--------------------------------------------------------------------------------
/img/suites.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/suites.jpg
--------------------------------------------------------------------------------
/img/summary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/summary.png
--------------------------------------------------------------------------------
/img/t-shaped.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/t-shaped.png
--------------------------------------------------------------------------------
/img/test-pyramid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test-pyramid.png
--------------------------------------------------------------------------------
/img/test_recorders1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test_recorders1.png
--------------------------------------------------------------------------------
/img/test_recorders2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test_recorders2.png
--------------------------------------------------------------------------------
/img/test_recorders3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test_recorders3.png
--------------------------------------------------------------------------------
/img/test_recorders4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test_recorders4.png
--------------------------------------------------------------------------------
/img/test_recorders5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/test_recorders5.png
--------------------------------------------------------------------------------
/img/tr1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/tr1.png
--------------------------------------------------------------------------------
/img/tr2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/tr2.png
--------------------------------------------------------------------------------
/img/tr3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/tr3.png
--------------------------------------------------------------------------------
/img/troubleshooting_appium_appium_doctor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/troubleshooting_appium_appium_doctor.png
--------------------------------------------------------------------------------
/img/virtual_environment_active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/virtual_environment_active.png
--------------------------------------------------------------------------------
/img/virtual_environment_create_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/virtual_environment_create_project.png
--------------------------------------------------------------------------------
/img/virtual_environment_requirements.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/virtual_environment_requirements.png
--------------------------------------------------------------------------------
/img/virtual_environment_structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/virtual_environment_structure.png
--------------------------------------------------------------------------------
/img/web-design-vocab-infographic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/web-design-vocab-infographic.png
--------------------------------------------------------------------------------
/img/web-testing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/web-testing.png
--------------------------------------------------------------------------------
/img/wp_dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/wp_dashboard.png
--------------------------------------------------------------------------------
/img/wp_login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/wp_login.png
--------------------------------------------------------------------------------
/img/wp_multisite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/wp_multisite.png
--------------------------------------------------------------------------------
/img/xcode_instruments_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/xcode_instruments_menu.png
--------------------------------------------------------------------------------
/img/zephyr_call_to_test.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_call_to_test.jpeg
--------------------------------------------------------------------------------
/img/zephyr_test_case_details.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_test_case_details.png
--------------------------------------------------------------------------------
/img/zephyr_test_cycles.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_test_cycles.jpeg
--------------------------------------------------------------------------------
/img/zephyr_test_library.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_test_library.png
--------------------------------------------------------------------------------
/img/zephyr_test_reports.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_test_reports.png
--------------------------------------------------------------------------------
/img/zephyr_test_script.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_test_script.png
--------------------------------------------------------------------------------
/img/zephyr_traceability.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_traceability.png
--------------------------------------------------------------------------------
/img/zephyr_version_control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infinum/qa-handbook/40c5c709d775b01fc8d4147e8d6fbcbf5dd4c7b5/img/zephyr_version_control.png
--------------------------------------------------------------------------------
/intro.slim:
--------------------------------------------------------------------------------
1 | .intro
2 | section.lead.intro__lead
3 | .lead__image.lead__image--qa-header.lead__image--shorter.lead__image--eat-mobile-gutter
4 | .lead__hashtag.lead__hashtag--dark #DigitalEntomologyAtItsFinest
5 | h1.lead__title Infinum QA Handbook
6 | .lead__info.lead__info--confined Our handbook is based on 9 years of experience in destroying applications
7 |
8 | .generic-container
9 | section
10 | .intro__testimonials
11 | .testimonial.intro__testimonial
12 | .testimonial__number.testimonial__number--small 100k+
13 | .label.label--hours
14 | .label__desc.label__desc--small hours of testing
15 |
16 | .testimonial.intro__testimonial
17 | .testimonial__number.testimonial__number--small 50k+
18 | .label.label--code
19 | .label__desc.label__desc--small bugs found
20 |
21 | .testimonial.intro__testimonial
22 | .testimonial__number.testimonial__number--small 100+
23 | .label.label--projects
24 | .label__desc.label__desc--small tested apps
25 |
26 | .testimonial.intro__testimonial
27 | .testimonial__number.testimonial__number--small 43
28 | .label.label--people
29 | .label__desc.label__desc--small testers
30 |
31 | .paragraph.intro__paragraph
32 | .paragraph__title Introduction
33 | .paragraph__content The key to building a great product is building a great team first. To me, great teams aren’t bound by roles, but they’re driven by moving forward.
34 |
--------------------------------------------------------------------------------