0

My apologies if this is not clear at any point (or if the vernacular isn't quite right) but I will do my best!

First time actually posting in a forum ;) ...

Any help from those in the know would be greatly appreciated.

I am using Selenium with Python bindings to conduct automated testing of a web based application across a number of platforms (OS) and browsers.

As part of this I am using the HTMLTestRunner module to generate a report at the end of each test run. It is here in that my problem lies.

The result of my code as it currently reads is that for each platform/ browser combination within respective lists, the HTMLTestRunner module is initialised and conducts a single test case... in turn generating the report and closing.

This creates problems with the generated report overwriting it self (or leads to formatting problems) as HTMLTestRunner is designed to be initialised, then conduct all test cases, then create a single report using all the test results.

Incidently if I use 'unittest.TextTestRunner()' instead of the HTMLTestRunner then essentially the same thing is happening only the reults are obviously displayed in the shell. ran 1 test... OK... ran 1 test... OK... et

I have tried using the line 'unittest.main(exit=False) which actually appears to work for results displyed within the shell eg all tests are run before any report is provided.

Unfortunatly I have not found a way of using this functionality with HTMLTestRunner.

(I suspect that someone is going to come back with using a meta class to dynamically generate tests instead of looping the execution code line like this. While I have looked into this I found myself at a complete loss as to how to implement this and a number of developer types have told me that this is something to steer clear of us (don't want to start a debate here!).)

Anyway a simplified example of the code that I am using is as per below:

global platform_list

platform_list = ['XP','VISTA','LINUX','WIN8','MAC']

global browser_list

browser_list = ['internet explorer','firefox','chrome','safari','opera']

class configuration(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Remote(command_executor= executor, desired_capabilities={'platform': platform, 'browserName': browser})
        self.driver.implicitly_wait(30)
        self.base_url = environment
        self.verificationErrors = []
        self.accept_next_alert = True

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

class test_case_A(configuration):
    def test_case_A(self):
        try:
            some code
        except:
            some code

class test_case_B(test_case_A):
    def test_case_B(self):
        self.test_case_A()
        try:
            some code
        except:
            some code

unit_test_suite = unittest.TestSuite()
unit_test_suite.addTest(test_case_A('test_case_A')), (test_case_B('test_case_B'))

results = file('results.html', 'wb')

runner = HTMLTestRunner.HTMLTestRunner(stream = results, title = 'Whatever', description = 'Whatever')

global platform
global browser

for platform in platform_list:
    for browser in browser_list:
        unittest.TextTestRunner().run(unit_test_suite)

I just want to state that while certain elements of the above code may be unnessecary such as global declarations they are required in the actual!

Any help would be greatly appreciated! Many thanks...

user2982308
  • 1
  • 1
  • 1

1 Answers1

1

I'm not sure if this answer will assist you as it may require a substantial restructure of your code, as far as I can understand.

For running my regression suite I have a particular module that builds the regression suite and then runs the HTMLtestrunner.

So each of my test-modules with multiple test-cases is imported, added to the TestSuite and then the suite itself is launched.

Here is a chopped down example:

from unittest import TestLoader, TestSuite
import HTMLTestRunner
import datetime
from root.nested.tests.test_class_1 import TestClass1
from root.nested.tests.test_class_2 import TestClass2

class RegressionSuite():

if __name__ == "__main__":

    file_name = datetime.datetime.now().strftime("%Y_%m_%d_%H%M_report.html")

    output = open(file_name, "wb")

    loader = TestLoader()
    suite = TestSuite((
                       loader.loadTestsFromTestCase(TestClass1),
                       loader.loadTestsFromTestCase(TestClass2)
                      ))
    runner = HTMLTestRunner(stream = output, verbosity = 1, title="Regression Suite")
    runner.run(suite)

When this module is executed, the resulting HTML results file lists each test-class with a summary and the detail can be shown to display the result for each test-case as well.

Mark Rowlands
  • 5,357
  • 2
  • 29
  • 41