Skip to content

Commit e4346c0

Browse files
committed
Merge pull request #13 from mdmintz/db-plugin-for-pytest
DB reporting plugin for pytest
2 parents a3188f3 + d219737 commit e4346c0

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed

conftest.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import shutil
55
import time
6+
from optparse import SUPPRESS_HELP
67
from seleniumbase.config import settings
78
from seleniumbase.fixtures import constants
89

@@ -34,6 +35,15 @@ def pytest_addoption(parser):
3435
parser.addoption('--log_path', dest='log_path',
3536
default='logs/',
3637
help='Where the log files are saved.')
38+
parser.addoption('--with-db_reporting', action="store_true",
39+
dest='with_db_reporting',
40+
default=False,
41+
help="Use to record test data in the MySQL database.")
42+
parser.addoption('--database_env', action='store',
43+
dest='database_env',
44+
choices=('prod', 'qa', 'test'),
45+
default='test',
46+
help=SUPPRESS_HELP)
3747
parser.addoption('--headless', action="store_true",
3848
dest='headless',
3949
default=False,
@@ -53,6 +63,8 @@ def pytest_addoption(parser):
5363
def pytest_configure(config):
5464
with_selenium = config.getoption('with_selenium')
5565
with_testing_base = config.getoption('with_testing_base')
66+
with_db_reporting = config.getoption('with_db_reporting')
67+
database_env = config.getoption('database_env')
5668
browser = config.getoption('browser')
5769
log_path = config.getoption('log_path')
5870
headless = config.getoption('headless')
@@ -63,13 +75,17 @@ def pytest_configure(config):
6375
demo_sleep = config.getoption('demo_sleep')
6476
if config.getoption('data') is not None:
6577
data = config.getoption('data')
78+
if config.getoption('database_env') is not None:
79+
database_env = config.getoption('database_env')
6680
# Create a temporary config file while tests are running
6781
pytest_config = '.pytest_config'
6882
config_file = open(pytest_config, 'w+')
6983
config_file.write("with_selenium:::%s\n" % with_selenium)
7084
config_file.write("browser:::%s\n" % browser)
7185
config_file.write("data:::%s\n" % data)
7286
config_file.write("with_testing_base:::%s\n" % with_testing_base)
87+
config_file.write("with_db_reporting:::%s\n" % with_db_reporting)
88+
config_file.write("database_env:::%s\n" % database_env)
7389
config_file.write("log_path:::%s\n" % log_path)
7490
config_file.write("headless:::%s\n" % headless)
7591
config_file.write("demo_mode:::%s\n" % demo_mode)

seleniumbase/fixtures/base_case.py

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@
44
by giving page elements enough time to load before taking action on them.
55
"""
66

7+
import getpass
78
import json
89
import logging
910
import os
1011
import pytest
1112
import sys
1213
import time
1314
import unittest
15+
import uuid
1416
from pyvirtualdisplay import Display
1517
from seleniumbase.config import settings
18+
from seleniumbase.core.application_manager import ApplicationManager
19+
from seleniumbase.core.testcase_manager import ExecutionQueryPayload
20+
from seleniumbase.core.testcase_manager import TestcaseDataPayload
21+
from seleniumbase.core.testcase_manager import TestcaseManager
1622
from seleniumbase.core import browser_launcher
1723
from seleniumbase.core import log_helper
24+
from seleniumbase.fixtures import constants
1825
from selenium.webdriver.remote.webdriver import WebDriver
1926
from selenium.webdriver.common.by import By
2027
import page_actions
@@ -325,10 +332,15 @@ def setUp(self):
325332
# Not using pytest (probably nosetests)
326333
self.is_pytest = False
327334
if self.is_pytest:
335+
test_id = "%s.%s.%s" % (self.__class__.__module__,
336+
self.__class__.__name__,
337+
self._testMethodName)
328338
self.with_selenium = pytest.config.option.with_selenium
329339
self.headless = pytest.config.option.headless
330340
self.headless_active = False
331341
self.with_testing_base = pytest.config.option.with_testing_base
342+
self.with_db_reporting = pytest.config.option.with_db_reporting
343+
self.database_env = pytest.config.option.database_env
332344
self.log_path = pytest.config.option.log_path
333345
self.browser = pytest.config.option.browser
334346
self.data = pytest.config.option.data
@@ -340,6 +352,52 @@ def setUp(self):
340352
self.headless_active = True
341353
if self.with_selenium:
342354
self.driver = browser_launcher.get_driver(self.browser)
355+
if self.with_db_reporting:
356+
self.execution_guid = str(uuid.uuid4())
357+
self.testcase_guid = None
358+
self.execution_start_time = 0
359+
self.case_start_time = 0
360+
self.application = None
361+
self.testcase_manager = None
362+
self.error_handled = False
363+
self.testcase_manager = TestcaseManager(self.database_env)
364+
#
365+
exec_payload = ExecutionQueryPayload()
366+
exec_payload.execution_start_time = int(time.time() * 1000)
367+
self.execution_start_time = exec_payload.execution_start_time
368+
exec_payload.guid = self.execution_guid
369+
exec_payload.username = getpass.getuser()
370+
self.testcase_manager.insert_execution_data(exec_payload)
371+
#
372+
data_payload = TestcaseDataPayload()
373+
self.testcase_guid = str(uuid.uuid4())
374+
data_payload.guid = self.testcase_guid
375+
data_payload.execution_guid = self.execution_guid
376+
if self.with_selenium:
377+
data_payload.browser = self.browser
378+
else:
379+
data_payload.browser = "N/A"
380+
data_payload.testcaseAddress = test_id
381+
application = ApplicationManager.generate_application_string(
382+
self._testMethodName)
383+
data_payload.env = application.split('.')[0]
384+
data_payload.start_time = application.split('.')[1]
385+
data_payload.state = constants.State.NOTRUN
386+
self.testcase_manager.insert_testcase_data(data_payload)
387+
self.case_start_time = int(time.time() * 1000)
388+
389+
def __insert_test_result(self, state, err=None):
390+
data_payload = TestcaseDataPayload()
391+
data_payload.runtime = int(time.time() * 1000) - self.case_start_time
392+
data_payload.guid = self.testcase_guid
393+
data_payload.execution_guid = self.execution_guid
394+
data_payload.state = state
395+
if err is not None:
396+
data_payload.message = err[1].__str__().split(
397+
'''-------------------- >> '''
398+
'''begin captured logging'''
399+
''' << --------------------''', 1)[0]
400+
self.testcase_manager.update_testcase_data(data_payload)
343401

344402
def tearDown(self):
345403
"""
@@ -349,12 +407,12 @@ def tearDown(self):
349407
super(SubClassOfBaseCase, self).tearDown()
350408
"""
351409
if self.is_pytest:
410+
test_id = "%s.%s.%s" % (self.__class__.__module__,
411+
self.__class__.__name__,
412+
self._testMethodName)
352413
if self.with_selenium:
353414
# Save a screenshot if logging is on when an exception occurs
354415
if self.with_testing_base and (sys.exc_info()[1] is not None):
355-
test_id = "%s.%s.%s" % (self.__class__.__module__,
356-
self.__class__.__name__,
357-
self._testMethodName)
358416
test_logpath = self.log_path + "/" + test_id
359417
if not os.path.exists(test_logpath):
360418
os.makedirs(test_logpath)
@@ -370,3 +428,11 @@ def tearDown(self):
370428
if self.headless:
371429
if self.headless_active:
372430
self.display.stop()
431+
if self.with_db_reporting:
432+
if sys.exc_info()[1] is not None:
433+
self.__insert_test_result(constants.State.ERROR)
434+
else:
435+
self.__insert_test_result(constants.State.PASS)
436+
runtime = int(time.time() * 1000) - self.execution_start_time
437+
self.testcase_manager.update_execution_data(
438+
self.execution_guid, runtime)

0 commit comments

Comments
 (0)