Best Python code snippet using autotest_python
test_foreign_keys.py
Source:test_foreign_keys.py
1# nuScenes dev-kit.2# Code written by Holger Caesar, 2020.3import itertools4import os5import unittest6from collections import defaultdict7from typing import List, Dict, Any8from nuimages.nuimages import NuImages9class TestForeignKeys(unittest.TestCase):10 def __init__(self, _: Any = None, version: str = 'v1.0-mini', dataroot: str = None):11 """12 Initialize TestForeignKeys.13 Note: The second parameter is a dummy parameter required by the TestCase class.14 :param version: The NuImages version.15 :param dataroot: The root folder where the dataset is installed.16 """17 super().__init__()18 self.version = version19 if dataroot is None:20 self.dataroot = os.environ['NUIMAGES']21 else:22 self.dataroot = dataroot23 self.nuim = NuImages(version=self.version, dataroot=self.dataroot, verbose=False)24 def runTest(self) -> None:25 """26 Dummy function required by the TestCase class.27 """28 pass29 def test_foreign_keys(self) -> None:30 """31 Test that every foreign key points to a valid token.32 """33 # Index the tokens of all tables.34 index = dict()35 for table_name in self.nuim.table_names:36 print('Indexing table %s...' % table_name)37 table: list = self.nuim.__getattr__(table_name)38 tokens = [row['token'] for row in table]39 index[table_name] = set(tokens)40 # Go through each table and check the foreign_keys.41 for table_name in self.nuim.table_names:42 table: List[Dict[str, Any]] = self.nuim.__getattr__(table_name)43 if self.version.endswith('-test') and len(table) == 0: # Skip test annotations.44 continue45 keys = table[0].keys()46 # Check 1-to-1 link.47 one_to_one_names = [k for k in keys if k.endswith('_token') and not k.startswith('key_')]48 for foreign_key_name in one_to_one_names:49 print('Checking one-to-one key %s in table %s...' % (foreign_key_name, table_name))50 foreign_table_name = foreign_key_name.replace('_token', '')51 foreign_tokens = set([row[foreign_key_name] for row in table])52 # Check all tokens are valid.53 if self.version.endswith('-mini') and foreign_table_name == 'category':54 continue # Mini does not cover all categories.55 foreign_index = index[foreign_table_name]56 self.assertTrue(foreign_tokens.issubset(foreign_index))57 # Check all tokens are covered.58 # By default we check that all tokens are covered. Exceptions are listed below.59 if table_name == 'object_ann':60 if foreign_table_name == 'category':61 remove = set([cat['token'] for cat in self.nuim.category if cat['name']62 in ['vehicle.ego', 'flat.driveable_surface']])63 foreign_index = foreign_index.difference(remove)64 elif foreign_table_name == 'sample_data':65 foreign_index = None # Skip as sample_datas may have no object_ann.66 elif table_name == 'surface_ann':67 if foreign_table_name == 'category':68 remove = set([cat['token'] for cat in self.nuim.category if cat['name']69 not in ['vehicle.ego', 'flat.driveable_surface']])70 foreign_index = foreign_index.difference(remove)71 elif foreign_table_name == 'sample_data':72 foreign_index = None # Skip as sample_datas may have no surface_ann.73 if foreign_index is not None:74 self.assertEqual(foreign_tokens, foreign_index)75 # Check 1-to-many link.76 one_to_many_names = [k for k in keys if k.endswith('_tokens')]77 for foreign_key_name in one_to_many_names:78 print('Checking one-to-many key %s in table %s...' % (foreign_key_name, table_name))79 foreign_table_name = foreign_key_name.replace('_tokens', '')80 foreign_tokens_nested = [row[foreign_key_name] for row in table]81 foreign_tokens = set(itertools.chain(*foreign_tokens_nested))82 # Check that all tokens are valid.83 foreign_index = index[foreign_table_name]84 self.assertTrue(foreign_tokens.issubset(foreign_index))85 # Check all tokens are covered.86 if self.version.endswith('-mini') and foreign_table_name == 'attribute':87 continue # Mini does not cover all categories.88 if foreign_index is not None:89 self.assertEqual(foreign_tokens, foreign_index)90 # Check prev and next.91 prev_next_names = [k for k in keys if k in ['previous', 'next']]92 for foreign_key_name in prev_next_names:93 print('Checking prev-next key %s in table %s...' % (foreign_key_name, table_name))94 foreign_table_name = table_name95 foreign_tokens = set([row[foreign_key_name] for row in table if len(row[foreign_key_name]) > 0])96 # Check that all tokens are valid.97 foreign_index = index[foreign_table_name]98 self.assertTrue(foreign_tokens.issubset(foreign_index))99 def test_prev_next(self) -> None:100 """101 Test that the prev and next points in sample_data cover all entries and have the correct ordering.102 """103 # Register all sample_datas.104 sample_to_sample_datas = defaultdict(lambda: [])105 for sample_data in self.nuim.sample_data:106 sample_to_sample_datas[sample_data['sample_token']].append(sample_data['token'])107 print('Checking prev-next pointers for completeness and correct ordering...')108 for sample in self.nuim.sample:109 # Compare the above sample_datas against those retrieved by using prev and next pointers.110 sd_tokens_pointers = self.nuim.get_sample_content(sample['token'])111 sd_tokens_all = sample_to_sample_datas[sample['token']]112 self.assertTrue(set(sd_tokens_pointers) == set(sd_tokens_all),113 'Error: Inconsistency in prev/next pointers!')114 timestamps = []115 for sd_token in sd_tokens_pointers:116 sample_data = self.nuim.get('sample_data', sd_token)117 timestamps.append(sample_data['timestamp'])118 self.assertTrue(sorted(timestamps) == timestamps, 'Error: Timestamps not properly sorted!')119if __name__ == '__main__':120 # Runs the tests without aborting on error.121 for nuim_version in ['v1.0-train', 'v1.0-val', 'v1.0-test', 'v1.0-mini']:122 print('Running TestForeignKeys for version %s...' % nuim_version)123 test = TestForeignKeys(version=nuim_version)124 test.test_foreign_keys()125 test.test_prev_next()...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!