def run_db_tests(self, suite): print("Running {0} tests with database".format(suite.countTestCases())) old_config = self.setup_databases() result = self.run_suite(suite) from corehq.sql_db.connections import Session, connection_manager Session.remove() connection_manager.dispose_all() self.teardown_databases(old_config) return self.suite_result(suite, result)
def loadtest(request): # The multimech results api is kinda all over the place. # the docs are here: http://testutils.org/multi-mechanize/datastore.html scripts = ['submit_form.py', 'ota_restore.py'] tests = [] # datetime info seems to be buried in GlobalConfig.results[0].run_id, # which makes ORM-level sorting problematic for gc in Session.query(GlobalConfig).all()[::-1]: gc.scripts = dict((uc.script, uc) for uc in gc.user_group_configs) if gc.results: for script, uc in gc.scripts.items(): uc.results = filter( lambda res: res.user_group_name == uc.user_group, gc.results ) test = { 'datetime': gc.results[0].run_id, 'run_time': gc.run_time, 'results': gc.results, } for script in scripts: test[script.split('.')[0]] = gc.scripts.get(script) tests.append(test) context = get_hqadmin_base_context(request) context.update({ "tests": tests, "hide_filters": True, }) date_axis = Axis(label="Date", dateFormat="%m/%d/%Y") tests_axis = Axis(label="Number of Tests in 30s") chart = LineChart("HQ Load Test Performance", date_axis, tests_axis) submit_data = [] ota_data = [] total_data = [] max_val = 0 max_date = None min_date = None for test in tests: date = test['datetime'] total = len(test['results']) max_val = total if total > max_val else max_val max_date = date if not max_date or date > max_date else max_date min_date = date if not min_date or date < min_date else min_date submit_data.append({'x': date, 'y': len(test['submit_form'].results)}) ota_data.append({'x': date, 'y': len(test['ota_restore'].results)}) total_data.append({'x': date, 'y': total}) deployments = [row['key'][1] for row in HqDeploy.get_list(settings.SERVER_ENVIRONMENT, min_date, max_date)] deploy_data = [{'x': min_date, 'y': 0}] for date in deployments: deploy_data.extend([{'x': date, 'y': 0}, {'x': date, 'y': max_val}, {'x': date, 'y': 0}]) deploy_data.append({'x': max_date, 'y': 0}) chart.add_dataset("Deployments", deploy_data) chart.add_dataset("Form Submission Count", submit_data) chart.add_dataset("OTA Restore Count", ota_data) chart.add_dataset("Total Count", total_data) context['charts'] = [chart] template = "hqadmin/loadtest.html" return render(request, template, context)
def tearDownClass(cls): cls.couch_user.delete(DOMAIN, deleted_by=None) Session.remove() super(BaseReportTest, cls).tearDownClass()
def tearDown(self): self._delete_everything() # todo: understand why this is necessary. the view call uses the session and the # signal doesn't fire to kill it. Session.remove() super(ConfigurableReportViewTest, self).tearDown()
def tearDownClass(cls): Session.remove()
def tearDownClass(cls): cls.case.delete() # todo: understand why this is necessary. the view call uses the session and the # signal doesn't fire to kill it. Session.remove() super(ConfigurableReportViewTest, cls).tearDownClass()
def tearDownClass(cls): Session.remove() super(ReportAPITest, cls).tearDownClass()
def tearDownClass(cls): cls.couch_user.delete() Session.remove()
def tearDownClass(cls): cls.couch_user.delete() Session.remove() super(BaseReportTest, cls).tearDownClass()
def tearDownClass(cls): cls._delete_everything() # todo: understand why this is necessary. the view call uses the session and the # signal doesn't fire to kill it. Session.remove()
class ConfigurableReportViewTest(ConfigurableReportTestMixin, TestCase): def _build_report_and_view(self, request=HttpRequest()): # Create report data_source_config = DataSourceConfiguration( domain=self.domain, display_name='foo', referenced_doc_type='CommCareCase', table_id="woop_woop", configured_filter={ "type": "boolean_expression", "operator": "eq", "expression": { "type": "property_name", "property_name": "type" }, "property_value": self.case_type, }, configured_indicators=[ { "type": "expression", "expression": { "type": "property_name", "property_name": 'fruit' }, "column_id": 'indicator_col_id_fruit', "display_name": 'indicator_display_name_fruit', "datatype": "string" }, { "type": "expression", "expression": { "type": "property_name", "property_name": 'num1' }, "column_id": 'indicator_col_id_num1', "datatype": "integer" }, { "type": "expression", "expression": { "type": "property_name", "property_name": 'num2' }, "column_id": 'indicator_col_id_num2', "datatype": "integer" }, ], ) data_source_config.validate() data_source_config.save() self.addCleanup(data_source_config.delete) tasks.rebuild_indicators(data_source_config._id) report_config = ReportConfiguration( domain=self.domain, config_id=data_source_config._id, title='foo', aggregation_columns=['doc_id'], columns=[{ "type": "field", "display": "report_column_display_fruit", "field": 'indicator_col_id_fruit', 'column_id': 'report_column_col_id_fruit', 'aggregation': 'simple' }, { "type": "percent", "display": "report_column_display_percent", 'column_id': 'report_column_col_id_percent', 'format': 'percent', "denominator": { "type": "field", "aggregation": "sum", "field": "indicator_col_id_num1", "column_id": "report_column_col_id_percent_num1" }, "numerator": { "type": "field", "aggregation": "sum", "field": "indicator_col_id_num2", "column_id": "report_column_col_id_percent_num2" } }, { "type": "expanded", "display": "report_column_display_expanded_num1", "field": 'indicator_col_id_num1', 'column_id': 'report_column_col_id_expanded_num1', }], configured_charts=[ { "type": 'pie', "value_column": 'count', "aggregation_column": 'fruit', "title": 'Fruits' }, { "type": 'multibar', "title": 'Fruit Properties', "x_axis_column": 'fruit', "y_axis_columns": [{ "column_id": "report_column_col_id_expanded_num1", "display": "Num1 values" }] }, ]) report_config.save() self.addCleanup(report_config.delete) view = ConfigurableReportView(request=request) view._domain = self.domain view._lang = "en" view._report_config_id = report_config._id return report_config, view @classmethod def tearDownClass(cls): for case in cls.cases: case.delete() # todo: understand why this is necessary. the view call uses the session and the # signal doesn't fire to kill it. Session.remove() super(ConfigurableReportViewTest, cls).tearDownClass()