From 4c0320ffc06fa0fcae2976a8c7c997fc0c823674 Mon Sep 17 00:00:00 2001 From: Ke Zou Date: Wed, 23 Sep 2015 15:18:11 +0100 Subject: bitbake: toaster: UI test improvements * Add decorator in logging mechanism * Add more debug information (Bitbake rev: ab94f4bbef38d23e7e8be0663781eaecf84f0172) Signed-off-by: Ke Zou Signed-off-by: Stanciu Mihail Signed-off-by: Elliot Smith Signed-off-by: Richard Purdie --- .../tts/toasteruitest/toaster_automation_test.py | 270 +++++++++++++-------- 1 file changed, 167 insertions(+), 103 deletions(-) (limited to 'bitbake') diff --git a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py index edd699bd3d..eac167b2e5 100755 --- a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py +++ b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py @@ -221,6 +221,68 @@ def extract_number_from_string(s): """ return re.findall(r'([0-9]+)', s) +# Below is decorator derived from toaster backend test code +class NoParsingFilter(logging.Filter): + def filter(self, record): + return record.levelno == 100 + +def LogResults(original_class): + orig_method = original_class.run + + #rewrite the run method of unittest.TestCase to add testcase logging + def run(self, result, *args, **kws): + orig_method(self, result, *args, **kws) + passed = True + testMethod = getattr(self, self._testMethodName) + + #if test case is decorated then use it's number, else use it's name + try: + test_case = testMethod.test_case + except AttributeError: + test_case = self._testMethodName + + #create custom logging level for filtering. + custom_log_level = 100 + logging.addLevelName(custom_log_level, 'RESULTS') + caller = os.path.basename(sys.argv[0]) + + def results(self, message, *args, **kws): + if self.isEnabledFor(custom_log_level): + self.log(custom_log_level, message, *args, **kws) + logging.Logger.results = results + + logging.basicConfig(filename=os.path.join(os.getcwd(),'results-'+caller+'.log'), + filemode='w', + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%H:%M:%S', + level=custom_log_level) + for handler in logging.root.handlers: + handler.addFilter(NoParsingFilter()) +# local_log = logging.getLogger(caller) + local_log = logging.getLogger() + + #check status of tests and record it + for (name, msg) in result.errors: + if self._testMethodName == str(name).split(' ')[0]: + local_log.results("Testcase "+str(test_case)+": ERROR") + local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n") + passed = False + for (name, msg) in result.failures: + if self._testMethodName == str(name).split(' ')[0]: + local_log.results("Testcase "+str(test_case)+": FAILED") + local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n") + passed = False + for (name, msg) in result.skipped: + if self._testMethodName == str(name).split(' ')[0]: + local_log.results("Testcase "+str(test_case)+": SKIPPED"+"\n\n\n") + passed = False + if passed: + local_log.results("Testcase "+str(test_case)+": PASSED"+"\n\n\n") + + original_class.run = run + return original_class + + ########################################### @@ -534,6 +596,7 @@ class toaster_cases_base(unittest.TestCase): def is_text_present (self, patterns): for pattern in patterns: if str(pattern) not in self.driver.page_source: + print pattern return False return True @@ -595,7 +658,7 @@ class toaster_cases_base(unittest.TestCase): # Note: to comply with the unittest framework, we call these test_xxx functions # from run_toastercases.py to avoid calling setUp() and tearDown() multiple times - +@LogResults class toaster_cases(toaster_cases_base): ############## # CASE 901 # @@ -630,12 +693,12 @@ class toaster_cases(toaster_cases_base): if is_list_inverted(column_list): self.driver.find_element_by_link_text(key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) else: - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list), msg=("%s column not sequenced" % key)) self.driver.find_element_by_link_text(key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_inverted(column_list)) + self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key)) self.log.info("case passed") @@ -659,10 +722,10 @@ class toaster_cases(toaster_cases_base): # if nothing found, we still count it as "pass" if new_target_column_texts: for text in new_target_column_texts: - self.failUnless(text.find(pattern)) + self.assertTrue(text.find(pattern), msg=("%s item doesn't exist " % pattern)) self.driver.find_element_by_css_selector("i.icon-remove").click() target_column_texts = self.get_table_column_text("class", "target") - self.failUnless(ori_target_column_texts == target_column_texts) + self.assertTrue(ori_target_column_texts == target_column_texts, msg=("builds changed after operations")) ############## @@ -685,10 +748,9 @@ class toaster_cases(toaster_cases_base): try: temp_element = self.find_element_by_text_in_table('otable', item) # this is how we find "filter icon" in the same level as temp_element(where "a" means clickable, "i" means icon) - self.failUnless(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']")) + self.assertTrue(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']")) except Exception,e: - self.log.error(" %s cannot be found! %s" % (item, e)) - self.failIf(True) + self.assertFalse(True, msg=(" %s cannot be found! %s" % (item, e))) raise # step 5-6 temp_element = self.find_element_by_link_text_in_table('otable', 'Outcome') @@ -731,10 +793,12 @@ class toaster_cases(toaster_cases_base): # This is how we find the "default" rows-number! rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text) print rows_displayed - self.failUnless(self.get_table_element(self.table_name, rows_displayed)) - self.failIf(self.get_table_element(self.table_name, rows_displayed + 1)) + self.assertTrue(self.get_table_element(self.table_name, rows_displayed), msg=("not enough rows displayed")) + self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1), \ + msg=("more rows displayed than expected")) # Search text box background text is "Search tasks" - self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']"),\ + msg=("background text doesn't exist")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys("busybox") @@ -763,22 +827,23 @@ class toaster_cases(toaster_cases_base): column_list = self.get_table_column_text("class", table_head_dict[key]) # after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here # the point is, after another click, it should be another order -# the fist case is special:this means every item in column_list is the same, so +# the first case is special:this means every item in column_list is the same, so # after one click, either sequenced or inverted will be fine if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \ or (not column_list) : self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) + self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list), \ + msg=("%s column not in any order" % key)) elif is_list_inverted(column_list): self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) else: - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_inverted(column_list)) + self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key)) # step 8-10 # filter dict: {link text name : filter table name in xpath} filter_dict = {'Executed':'filter_executed', 'Outcome':'filter_outcome', 'Cache attempt':'filter_cache_attempt'} @@ -837,9 +902,9 @@ class toaster_cases(toaster_cases_base): self.find_element_by_link_text_in_table('nav', key).click() head_list = self.get_table_head_text('otable') for item in test_dict[key]['check_head_list']: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("%s not in head row" % item)) column_list = self.get_table_column_text('class', test_dict[key]['class']) - self.failUnless(is_list_inverted(column_list)) + self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key)) self.driver.find_element_by_id("edit-columns-button").click() for item2 in test_dict[key]['check_column_list']: @@ -865,21 +930,24 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_partial_link_text("Generated files").click() head_list = self.get_table_head_text('otable') for item in ['File', 'Size']: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("%s not in head row" % item)) c_list = self.get_table_column_text('class', 'path') - self.failUnless(is_list_sequenced(c_list)) + self.assertTrue(is_list_sequenced(c_list), msg=("column not in order")) # step 7 self.driver.find_element_by_partial_link_text("Runtime dependencies").click() # save sceen here to observe... # note that here table name is not 'otable' head_list = self.get_table_head_text('dependencies') for item in ['Package', 'Version', 'Size']: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("%s not in head row" % item)) c_list = self.get_table_column_text_by_column_number('dependencies', 1) - self.failUnless(is_list_sequenced(c_list)) + self.assertTrue(is_list_sequenced(c_list), msg=("list not in order")) texts = ['Size', 'License', 'Recipe', 'Recipe version', 'Layer', \ - 'Layer branch', 'Layer commit', 'Layer directory'] - self.failUnless(self.is_text_present(texts)) + 'Layer branch', 'Layer commit'] + time.sleep(1) +# for text in texts: +# self.assertTrue(self.is_text_present(text), msg=("text %s not in page" % text)) + self.assertTrue(self.is_text_present(texts), msg=("text not in page")) ############## @@ -901,8 +969,8 @@ class toaster_cases(toaster_cases_base): # This is how we find the "default" rows-number! rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text) print rows_displayed - self.failUnless(self.get_table_element(self.table_name, rows_displayed)) - self.failIf(self.get_table_element(self.table_name, rows_displayed + 1)) + self.assertTrue(self.get_table_element(self.table_name, rows_displayed)) + self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1)) # Check the default table is sorted by Recipe tasks_column_count = len(self.driver.find_elements_by_xpath("/html/body/div[2]/div/div[2]/div[2]/table/tbody/tr/td[1]")) @@ -910,10 +978,10 @@ class toaster_cases(toaster_cases_base): default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1) #print default_column_list - self.failUnless(is_list_sequenced(default_column_list)) + self.assertTrue(is_list_sequenced(default_column_list)) # Search text box background text is "Search recipes" - self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package1) @@ -940,7 +1008,7 @@ class toaster_cases(toaster_cases_base): #self.driver.find_element_by_partial_link_text("zlib").click() #self.driver.back() - #self.failUnless(is_list_inverted(inverted_column_list)) + #self.assertTrue(is_list_inverted(inverted_column_list)) #self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click() table_head_dict = {'Recipe':'recipe__name', 'Recipe file':'recipe_file', 'Section':'recipe_section', \ @@ -953,52 +1021,52 @@ class toaster_cases(toaster_cases_base): or (not column_list) : self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) + self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list)) self.driver.find_element_by_partial_link_text("acl").click() self.driver.back() - self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) + self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list)) # Search text box background text is "Search recipes" - self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() column_search_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list)) + self.assertTrue(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list)) self.driver.find_element_by_css_selector("i.icon-remove").click() elif is_list_inverted(column_list): self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list)) self.driver.find_element_by_partial_link_text("acl").click() self.driver.back() - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list)) # Search text box background text is "Search recipes" - self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() column_search_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_sequenced(column_search_list)) + self.assertTrue(is_list_sequenced(column_search_list)) self.driver.find_element_by_css_selector("i.icon-remove").click() else: - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list)) self.find_element_by_link_text_in_table(self.table_name, key).click() column_list = self.get_table_column_text("class", table_head_dict[key]) - self.failUnless(is_list_inverted(column_list)) + self.assertTrue(is_list_inverted(column_list)) try: self.driver.find_element_by_partial_link_text("acl").click() except: self.driver.find_element_by_partial_link_text("zlib").click() self.driver.back() - self.failUnless(is_list_inverted(column_list)) + self.assertTrue(is_list_inverted(column_list)) # Search text box background text is "Search recipes" - self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() column_search_list = self.get_table_column_text("class", table_head_dict[key]) #print column_search_list - self.failUnless(is_list_inverted(column_search_list)) + self.assertTrue(is_list_inverted(column_search_list)) self.driver.find_element_by_css_selector("i.icon-remove").click() # Bug 5919 @@ -1014,7 +1082,7 @@ class toaster_cases(toaster_cases_base): #print tasks_column_count default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1) #print default_column_list - self.failUnless(is_list_sequenced(default_column_list)) + self.assertTrue(is_list_sequenced(default_column_list)) self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("recipe_file").click() @@ -1064,31 +1132,31 @@ class toaster_cases(toaster_cases_base): # step 3 head_list = self.get_table_head_text('otable') for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']: - self.failUnless(item in head_list) - self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("depends_on").click() self.driver.find_element_by_id("layer_version__branch").click() self.driver.find_element_by_id("layer_version__layer__commit").click() self.driver.find_element_by_id("depends_by").click() - self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() + self.driver.find_element_by_id("edit-columns-button").click() # check if columns selected above is shown - check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Layer directory', 'Reverse dependencies'] + check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Reverse dependencies'] head_list = self.get_table_head_text('otable') time.sleep(2) print head_list for item in check_list: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) # un-check 'em all - self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() + self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("depends_on").click() self.driver.find_element_by_id("layer_version__branch").click() self.driver.find_element_by_id("layer_version__layer__commit").click() self.driver.find_element_by_id("depends_by").click() - self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() + self.driver.find_element_by_id("edit-columns-button").click() # don't exist any more head_list = self.get_table_head_text('otable') for item in check_list: - self.failIf(item in head_list) + self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item)) ############## @@ -1104,7 +1172,7 @@ class toaster_cases(toaster_cases_base): # step 3 head_list = self.get_table_head_text('otable') for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) # step 4 self.driver.find_element_by_id("edit-columns-button").click() # save screen @@ -1318,7 +1386,8 @@ class toaster_cases(toaster_cases_base): head_list = self.get_table_head_text('otable') print head_list print len(head_list) - self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) # step 8 # search other string. and click "Variable" to re-sort, check if table # head is still the same @@ -1327,10 +1396,12 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search-button").click() self.find_element_by_link_text_in_table('otable', 'Variable').click() head_list = self.get_table_head_text('otable') - self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) self.find_element_by_link_text_in_table('otable', 'Variable').click() head_list = self.get_table_head_text('otable') - self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) ############## @@ -1346,11 +1417,11 @@ class toaster_cases(toaster_cases_base): self.find_element_by_link_text_in_table('nav', 'Configuration').click() self.driver.find_element_by_link_text("BitBake variables").click() variable_list = self.get_table_column_text('class', 'variable_name') - self.failUnless(is_list_sequenced(variable_list)) + self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order")) # step 4 self.find_element_by_link_text_in_table('otable', 'Variable').click() variable_list = self.get_table_column_text('class', 'variable_name') - self.failUnless(is_list_inverted(variable_list)) + self.assertTrue(is_list_inverted(variable_list), msg=("list not inverted")) self.find_element_by_link_text_in_table('otable', 'Variable').click() # step 5 # searching won't change the sequentiality @@ -1358,7 +1429,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search").send_keys("lib") self.driver.find_element_by_id("search-button").click() variable_list = self.get_table_column_text('class', 'variable_name') - self.failUnless(is_list_sequenced(variable_list)) + self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order")) ############## @@ -1372,7 +1443,7 @@ class toaster_cases(toaster_cases_base): # Step 2 # default sequence in "Completed on" column is inverted c_list = self.get_table_column_text('class', 'completed_on') - self.failUnless(is_list_inverted(c_list)) + self.assertTrue(is_list_inverted(c_list), msg=("list not inverted")) # step 3 self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("started_on").click() @@ -1380,8 +1451,8 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("time").click() self.driver.find_element_by_id("edit-columns-button").click() head_list = self.get_table_head_text('otable') - for item in ['Outcome', 'Target', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']: - self.failUnless(item in head_list) + for item in ['Outcome', 'Recipe', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) ############## @@ -1395,7 +1466,7 @@ class toaster_cases(toaster_cases_base): # Please refer to case 924 requirement # default sequence in "Completed on" column is inverted c_list = self.get_table_column_text('class', 'completed_on') - self.failUnless(is_list_inverted(c_list)) + self.assertTrue(is_list_inverted(c_list), msg=("list not inverted")) # Step 4 # click Errors , order in "Completed on" should be disturbed. Then hide # error column to check if order in "Completed on" can be restored @@ -1406,7 +1477,7 @@ class toaster_cases(toaster_cases_base): # Note: without time.sleep here, there'll be unpredictable error..TBD time.sleep(1) c_list = self.get_table_column_text('class', 'completed_on') - self.failUnless(is_list_inverted(c_list)) + self.assertTrue(is_list_inverted(c_list), msg=("list not inverted")) ############## @@ -1422,7 +1493,7 @@ class toaster_cases(toaster_cases_base): self.find_element_by_link_text_in_table('nav', 'Packages').click() check_head_list = ['Package', 'Package version', 'Size', 'Recipe'] head_list = self.get_table_head_text('otable') - self.failUnless(head_list == check_head_list) + self.assertTrue(head_list == check_head_list, msg=("head row not as expected")) # Step 4 # pulldown menu option_ids = ['recipe__layer_version__layer__name', 'recipe__layer_version__branch', \ @@ -1451,7 +1522,7 @@ class toaster_cases(toaster_cases_base): self.find_element_by_link_text_in_table('nav', 'Packages').click() # column -- Package column_list = self.get_table_column_text_by_column_number('otable', 1) - self.failUnless(is_list_sequenced(column_list)) + self.assertTrue(is_list_sequenced(column_list), msg=("list not in order")) self.find_element_by_link_text_in_table('otable', 'Size').click() @@ -1473,7 +1544,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("edit-columns-button").click() #get modified table header new_head = self.get_table_head_text('otable') - self.failUnless(head_list > new_head) + self.assertTrue(head_list > new_head) ############## # CASE 943 # @@ -1490,7 +1561,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search").send_keys("bash") self.driver.find_element_by_id("search-button").click() #check for the search result message "XX packages found" - self.failUnless(self.is_text_present("packages found")) + self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text")) ############## @@ -1511,11 +1582,12 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("edit-columns-button").click() # otable is the recipes table here otable_head_text = self.get_table_head_text('otable') - for item in ["Layer", "Layer branch", "Layer commit", "Layer directory"]: - self.failIf(item not in otable_head_text) + for item in ["Layer", "Layer branch", "Layer commit"]: + self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item)) # click the fist recipe, whatever it is self.get_table_element("otable", 1, 1).click() - self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"])) + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]), \ + msg=("text not in web page")) # step 2: test Packages page stuff. almost same as above self.driver.back() @@ -1528,10 +1600,11 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("edit-columns-button").click() otable_head_text = self.get_table_head_text("otable") for item in ["Layer", "Layer branch", "Layer commit"]: - self.failIf(item not in otable_head_text) + self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item)) # click the fist recipe, whatever it is self.get_table_element("otable", 1, 1).click() - self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"])) + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ + msg=("text not in web page")) # step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes... self.driver.back() @@ -1543,17 +1616,18 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("edit-columns-button").click() otable_head_text = self.get_table_head_text("otable") for item in ["Layer", "Layer branch", "Layer commit"]: - self.failIf(item not in otable_head_text) + self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item)) # click the fist recipe, whatever it is self.get_table_element("otable", 1, 1).click() - self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"])) + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ + msg=("text not in web page")) # step 4: check Configuration page self.driver.back() self.driver.find_element_by_link_text("Configuration").click() otable_head_text = self.get_table_head_text() for item in ["Layer", "Layer branch", "Layer commit"]: - self.failIf(item not in otable_head_text) + self.assertTrue(item not in otable_head_text, msg=("item %s should not be in head row" % item)) ############## @@ -1578,14 +1652,14 @@ class toaster_cases(toaster_cases_base): # Sure we can use driver.get(url) to refresh page, but since page will vary, we use click link text here self.driver.find_element_by_link_text(items).click() Select(self.driver.find_element_by_css_selector("select.pagesize")).select_by_visible_text(str(rows_displayed)) - self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) - self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) + self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) + self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) # click 1st package, then go back to check if it's still those rows shown. self.driver.find_element_by_xpath(xpath_table + "/tr[1]/td[1]").click() self.driver.find_element_by_link_text(items).click() - self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) - self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) + self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) + self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) ############## @@ -1676,7 +1750,7 @@ class toaster_cases(toaster_cases_base): check_list = ['Description', 'Set in file'] head_list = self.get_table_head_text('otable') for item in check_list: - self.failIf(item in head_list) + self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item)) # check these 2 options and verify again self.driver.find_element_by_id('edit-columns-button').click() self.driver.find_element_by_xpath(xpath_option('description')).click() @@ -1684,7 +1758,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id('edit-columns-button').click() head_list = self.get_table_head_text('otable') for item in check_list: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) ############## @@ -1706,7 +1780,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search-button").click() #get number of variables visible after search number_after_search = self.driver.find_element_by_class_name('page-header').text - self.failUnless(number_before_search > number_after_search) + self.assertTrue(number_before_search > number_after_search, msg=("items should be less after search")) ############## @@ -1725,11 +1799,11 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_partial_link_text("Directory structure") except Exception,e: self.log.error(e) - self.failIf(True) + self.assertFalse(True) # step 4 head_list = self.get_table_head_text('otable') for item in ['Package', 'Package version', 'Size', 'Dependencies', 'Reverse dependencies', 'Recipe']: - self.failUnless(item in head_list) + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) # step 5-6 self.driver.find_element_by_id("edit-columns-button").click() selectable_class = 'checkbox' @@ -1749,22 +1823,15 @@ class toaster_cases(toaster_cases_base): unselectable_list.append(element.text) # check them for item in selectable_check_list: - if item not in selectable_list: - self.log.error(" %s not found in dropdown menu \n" % item) - self.failIf(True) + self.assertTrue(item in selectable_list, msg=("%s not found in dropdown menu" % item)) for item in unselectable_check_list: - if item not in unselectable_list: - self.log.error(" %s not found in dropdown menu \n" % item) - self.failIf(True) + self.assertTrue(item in unselectable_list, msg=("%s not found in dropdown menu" % item)) self.driver.find_element_by_id("edit-columns-button").click() # step 7 self.driver.find_element_by_partial_link_text("Directory structure").click() head_list = self.get_table_head_text('dirtable') for item in ['Directory / File', 'Symbolic link to', 'Source package', 'Size', 'Permissions', 'Owner', 'Group']: - if item not in head_list: - self.log.error(" %s not found in Directory structure table head \n" % item) - self.failIf(True) - + self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item)) ############## # CASE 950 # @@ -1794,12 +1861,11 @@ class toaster_cases(toaster_cases_base): try: self.find_element_by_link_text_in_table('nav', item) except Exception: - self.log.error("link %s cannot be found in the page" % item) - self.failIf(True) + self.assertFalse(True, msg=("link %s cannot be found in the page" % item)) # step 6 check_list_2 = ['Packages included', 'Total package size', \ 'License manifest', 'Image files'] - self.failUnless(self.is_text_present(check_list_2)) + self.assertTrue(self.is_text_present(check_list_2), msg=("text not in web page")) self.driver.back() try: fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']") @@ -1816,12 +1882,11 @@ class toaster_cases(toaster_cases_base): try: self.find_element_by_link_text_in_table('nav', item) except Exception: - self.log.error("link %s cannot be found in the page" % item) - self.failIf(True) + self.assertFalse(True, msg=("link %s cannot be found in the page" % item)) # step 7 involved check_list_3 = ['Machine', 'Distro', 'Layers', 'Total number of tasks', 'Tasks executed', \ 'Tasks not executed', 'Reuse', 'Recipes built', 'Packages built'] - self.failUnless(self.is_text_present(check_list_3)) + self.assertTrue(self.is_text_present(check_list_3), msg=("text not in web page")) self.driver.back() @@ -1881,6 +1946,5 @@ class toaster_cases(toaster_cases_base): tasks, recipes, packages need to run manually") self.driver.find_element_by_partial_link_text("Toaster manual").click() if not self.is_text_present("Toaster Manual"): - self.log.error("please check [Toaster manual] link on page") - self.failIf(True) + self.assertFalse(True, msg=("please check [Toaster manual] link on page")) -- cgit 1.2.3-korg