Skip to content

Commit 4bde7bd

Browse files
author
Oleg Averkin
committed
Add allure reporting
1 parent 3ac082e commit 4bde7bd

File tree

9 files changed

+94
-6
lines changed

9 files changed

+94
-6
lines changed

.circleci/config.yml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ jobs:
1616
python3 -m venv venv
1717
. venv/bin/activate
1818
pip install -r requirements.txt
19+
wget https://dl.bintray.com/qameta/maven/io/qameta/allure/allure-commandline/2.11.0/allure-commandline-2.11.0.zip
20+
unzip allure-commandline-2.11.0.zip
1921
- save_cache:
2022
paths:
2123
- ./venv
@@ -24,7 +26,14 @@ jobs:
2426
name: run tests
2527
command: |
2628
. venv/bin/activate
27-
pytest -v
29+
chmod -R 777 ./allure-2.11.0/bin/
30+
pytest --alluredir=./allure-results
31+
- run:
32+
name: run report
33+
when: always
34+
command: |
35+
./allure-2.11.0/bin/allure generate -c
2836
- store_artifacts:
29-
path: test-reports
30-
destination: test-reports
37+
path: allure-report
38+
destination: allure-report
39+
when: always

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
.idea/
22
.DS_Store
33
.pytest_cache
4-
__pycache__
4+
__pycache__
5+
.allure-report
6+
allure-report
7+
allure-results

conftest.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import allure
2+
import pytest
3+
4+
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
5+
def pytest_runtest_makereport(item):
6+
outcome = yield
7+
rep = outcome.get_result()
8+
marker = item.get_closest_marker("ui")
9+
if marker:
10+
if rep.when == "call" and not rep.passed: # we only look at actual failing test calls, not setup/teardown
11+
try:
12+
allure.attach(item.instance.driver.get_screenshot_as_png(),
13+
name=item.name,
14+
attachment_type=allure.attachment_type.PNG)
15+
except Exception as e:
16+
print(e)

pageobjects/base_page.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import time
2+
import allure
23
from selenium.webdriver.common.by import By
34
from selenium.webdriver.common.keys import Keys
45
from selenium.webdriver.support.ui import WebDriverWait
@@ -10,18 +11,21 @@ def __init__(self, driver):
1011
self.driver = driver
1112
self.wait = WebDriverWait(driver, 15)
1213

14+
@allure.step
1315
def wait_for_element(self, element, selector_type: By):
1416
self.wait.until(EC.presence_of_element_located((selector_type, element)))
1517
self.wait.until(EC.visibility_of_element_located((selector_type, element)))
1618
self.wait.until(EC.element_to_be_clickable((selector_type, element)))
1719

20+
@allure.step
1821
def click_elem(self, element, selector_type: By):
1922
self.wait.until(EC.presence_of_element_located((selector_type, element)))
2023
self.wait.until(EC.visibility_of_element_located((selector_type, element)))
2124
self.wait.until(EC.element_to_be_clickable((selector_type, element)))
2225
elem = self.driver.find_element(selector_type, element)
2326
elem.click()
2427

28+
@allure.step
2529
def type_to_elem(self, element, selector_type: By, text, clean=True, click_enter=False, type_delay=False):
2630
self.wait.until(EC.presence_of_element_located((selector_type, element)))
2731
self.wait.until(EC.visibility_of_element_located((selector_type, element)))
@@ -38,21 +42,25 @@ def type_to_elem(self, element, selector_type: By, text, clean=True, click_enter
3842
if click_enter:
3943
elem.send_keys(Keys.ENTER)
4044

45+
@allure.step
4146
def get_field_data(self, element, selector_type: By):
4247
self.wait.until(EC.presence_of_element_located((selector_type, element)))
4348
self.wait.until(EC.visibility_of_element_located((selector_type, element)))
4449
elem = self.driver.find_element(selector_type, element)
4550
return elem.get_attribute('value')
4651

52+
@allure.step
4753
def presence_of_element(self, element, selector_type: By):
4854
for i in range(10):
4955
time.sleep(0.3)
5056
if not self.driver.find_elements(selector_type, element):
5157
return False
5258
return True
5359

60+
@allure.step
5461
def count_issues(self, element, selector_type: By):
5562
return self.driver.find_elements(selector_type, element)
5663

64+
@allure.step
5765
def browser_refresh(self):
5866
self.driver.refresh()

pageobjects/issues_page.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from selenium.webdriver.common.by import By
2-
import time
2+
import allure
33

44
from pageobjects.base_page import BasePage
55

@@ -21,9 +21,11 @@
2121

2222
class IssuePage(BasePage):
2323

24+
@allure.step
2425
def get_title(self):
2526
return self.driver.title
2627

28+
@allure.step
2729
def create_issue(self, summary=None, priority=None, assignee=None, new_issue=True):
2830
if new_issue:
2931
self.click_elem(create_issue_button_id, By.ID)
@@ -34,6 +36,7 @@ def create_issue(self, summary=None, priority=None, assignee=None, new_issue=Tru
3436
return False
3537
return True
3638

39+
@allure.step
3740
def update_issue(self, summary=None, priority=None, assignee=None):
3841
self.type_to_elem(summary_field_id, By.ID, summary, True)
3942
self.type_to_elem(priority_field_css, By.CSS_SELECTOR, priority, True, True)
@@ -42,11 +45,13 @@ def update_issue(self, summary=None, priority=None, assignee=None):
4245
return False
4346
return True
4447

48+
@allure.step
4549
def open_issue_in_list(self, summary):
4650
self.click_elem('.issue-list [title="%s"] a' % summary, By.CSS_SELECTOR)
4751
self.wait_for_element(edit_issue_button_id, By.ID)
4852
self.click_elem(edit_issue_button_id, By.ID)
4953

54+
@allure.step
5055
def get_issue_fields(self, close_edit=True):
5156
fields_data_list = []
5257
fields_data_list.append(self.get_field_data(summary_field_id, By.ID))
@@ -55,6 +60,7 @@ def get_issue_fields(self, close_edit=True):
5560
self.click_elem(cancel_issue_button_css, By.CSS_SELECTOR)
5661
return fields_data_list
5762

63+
@allure.step
5864
def search_issues(self, summary):
5965
self.type_to_elem(search_field_id, By.ID, summary, True, True)
6066
self.wait_for_element(edit_issue_button_id, By.ID)
@@ -63,6 +69,7 @@ def search_issues(self, summary):
6369
else:
6470
return 0
6571

72+
@allure.step
6673
def search_nonexistent_issues(self, summary):
6774
self.type_to_elem(search_field_id, By.ID, summary, True, True)
6875
if self.driver.find_elements(By.CSS_SELECTOR, issues_list_css):

pageobjects/login_page.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from selenium.webdriver.common.by import By
22
from pageobjects.base_page import BasePage
3+
import allure
34

45
login_form_id = 'login-form-username'
56
password_form_id = 'login-form-password'
@@ -10,18 +11,22 @@
1011

1112
class LoginPage(BasePage):
1213

14+
@allure.step
1315
def get_title(self):
1416
return self.driver.title
1517

18+
@allure.step
1619
def login_to_jira(self, login, password):
1720
self.type_to_elem(login_form_id, By.ID, login)
1821
self.type_to_elem(password_form_id, By.ID, password)
1922
self.click_elem(submit_button_id, By.ID)
2023
return self.presence_of_element(create_issue_id, By.ID)
2124

25+
@allure.step
2226
def on_page(self):
2327
return self.presence_of_element(create_issue_id, By.ID)
2428

29+
@allure.step
2530
def open(self, url):
2631
self.driver.get(url)
2732
return self

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
allure-pytest==2.6.2
2+
allure-python-commons==2.6.2
13
appdirs==1.4.0
24
astroid==1.4.9
35
atomicwrites==1.3.0
@@ -34,4 +36,4 @@ urllib3==1.24.2
3436
webdriver-manager==1.7
3537
wrapt==1.10.8
3638
xmltodict==0.12.0
37-
pytest==4.4.0
39+
pytest==4.4.0

tests/test_jira_issues.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
from selenium import webdriver
44
from webdriver_manager.chrome import ChromeDriverManager
55

6+
import allure
7+
import pytest
8+
69
creds = "OlegAverkin"
710
base_url = "http://jira.hillel.it:8080"
811
auth_url = base_url + "/secure/RapidBoard.jspa?projectKey=WEBINAR"
@@ -19,25 +22,46 @@ def setup_method(self):
1922
self.login_page.open(my_issues)
2023
self.login_page.login_to_jira(creds, creds)
2124

25+
@pytest.mark.ui
26+
@allure.tag('ui')
27+
@allure.title("Create issue")
2228
def test_create_issue(self):
2329
assert self.issue_page.create_issue("OA_new_issue", "Blocker", "OlegAverkin") is True
2430

31+
@pytest.mark.ui
32+
@allure.tag('ui')
33+
@allure.title("Verify created issue")
2534
def test_verify_created_issue(self):
2635
self.issue_page.open_issue_in_list("OA_new_issue")
2736
assert self.issue_page.get_issue_fields() == ["OA_new_issue", "Blocker"]
2837

38+
@pytest.mark.ui
39+
@allure.tag('ui')
40+
@allure.title("Create issue with long summary")
2941
def test_create_issue_with_long_summary(self):
3042
assert self.issue_page.create_issue("x" * 256, "Blocker", "OlegAverkin") is False
3143

44+
@pytest.mark.ui
45+
@allure.tag('ui')
46+
@allure.title("Vreate issue with empty summary")
3247
def test_create_issue_with_empty_summary(self):
3348
assert self.issue_page.create_issue("", "Blocker", "OlegAverkin", True) is False
3449

50+
@pytest.mark.ui
51+
@allure.tag('ui')
52+
@allure.title("Search issue")
3553
def test_search_issue(self):
3654
assert self.issue_page.search_issues("OA_new_issue") == 1
3755

56+
@pytest.mark.ui
57+
@allure.tag('ui')
58+
@allure.title("Search nonexistent issue")
3859
def test_search_nonexistent_issue(self):
3960
assert self.issue_page.search_nonexistent_issues("somethingwrong") == 0
4061

62+
@pytest.mark.ui
63+
@allure.tag('ui')
64+
@allure.title("Update issue")
4165
def test_update_issue(self):
4266
self.issue_page.open_issue_in_list("OA_new_issue")
4367
assert self.issue_page.update_issue("OA_updated_issue", "Low", "OlegAverkin") is True

tests/test_login_page.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from pageobjects.login_page import LoginPage
22
from selenium import webdriver
33
from webdriver_manager.chrome import ChromeDriverManager
4+
import allure
5+
import pytest
46

57
creds = "OlegAverkin"
68
fake_creds = "fake_user"
@@ -15,20 +17,32 @@ def setup_method(self):
1517
self.driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
1618
self.login_page = LoginPage(self.driver)
1719

20+
@pytest.mark.ui
21+
@allure.tag('ui')
22+
@allure.title("Check title")
1823
def test_check_title(self):
1924
self.login_page.open(auth_url)
2025
assert self.login_page.get_title() == login_title
2126

27+
@pytest.mark.ui
28+
@allure.tag('ui')
29+
@allure.title("Login with wrong password")
2230
def test_login_with_wrong_password(self):
2331
self.login_page.open(auth_url)
2432
self.login_page.login_to_jira(creds, fake_creds)
2533
assert self.login_page.get_title() == login_title
2634

35+
@pytest.mark.ui
36+
@allure.tag('ui')
37+
@allure.title("Login with wrong username")
2738
def test_login_with_wrong_username(self):
2839
self.login_page.open(auth_url)
2940
self.login_page.login_to_jira(creds, fake_creds)
3041
assert self.login_page.get_title() == login_title
3142

43+
@pytest.mark.ui
44+
@allure.tag('ui')
45+
@allure.title("Login with correct credentials")
3246
def test_login_with_correct_credentials(self):
3347
self.login_page.open(auth_url)
3448
self.login_page.login_to_jira(creds, creds)

0 commit comments

Comments
 (0)