mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-29 13:33:35 +08:00
Add Python wrapper to ecl and use it to test functionality
* Add SWIG interface definition (and external numpy interface) to ecl classes * Add section in CMakeLists.txt to build Python bindings and execute Python-based tests * Write (property-based) tests that show the basic functionality of the Python bindings and the EKF (using pytest and hypothesis libraries) * Write minimal benchmark for the EKF update (using benchmark plugin for pytest) * Add plotting utilities to analyze tests * Add lint script to keep the Python scripts clean
This commit is contained in:
Executable
+94
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env python3
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (c) 2017 Estimation and Control Library (ECL). All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name ECL nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
###############################################################################
|
||||
"""Runs code checkers on ecl pytest code
|
||||
@author: Peter Dürr <Peter.Duerr@sony.com>
|
||||
"""
|
||||
from __future__ import print_function
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import division
|
||||
from __future__ import absolute_import
|
||||
|
||||
from subprocess import Popen, PIPE
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
CHECKERS = [
|
||||
['pep8', '.'],
|
||||
['pep8', './ekf_test'],
|
||||
['pep8', './lint'],
|
||||
['pylint', './lint', '--reports=n', '--score=n'],
|
||||
['pylint', './ekf_test', '--reports=n', '--score=n'],
|
||||
['pylint', './plot_utils.py', '--reports=n', '--score=n'],
|
||||
['pylint', './test_altitude.py', '--reports=n', '--score=n'],
|
||||
['pylint', './test_basics.py', '--reports=n', '--score=n'],
|
||||
['pylint', './test_sampling.py', '--reports=n', '--score=n'],
|
||||
['pylint', './test_utils.py', '--reports=n', '--score=n'],
|
||||
]
|
||||
"""List of checkers to run and their arguments
|
||||
"""
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
TIC = datetime.now()
|
||||
CHECKERS_RUN = 0
|
||||
ERROR = False
|
||||
for checker in CHECKERS:
|
||||
process = Popen(checker, stdout=PIPE)
|
||||
sys.stdout.write('.')
|
||||
sys.stdout.flush()
|
||||
CHECKERS_RUN += 1
|
||||
header = "Output from %s" % " ".join(checker)
|
||||
output = process.communicate()
|
||||
message = ""
|
||||
for elem in output:
|
||||
if elem is not None and elem:
|
||||
message += elem.decode('utf-8')
|
||||
ERROR = True
|
||||
if not message == "":
|
||||
print(header)
|
||||
print("=" * len(header))
|
||||
print(message)
|
||||
print("=" * len(header))
|
||||
|
||||
TOC = datetime.now()
|
||||
print("\n" + ''.join(['-']*70))
|
||||
print("Ran %i checkers in %fs\n" % (CHECKERS_RUN,
|
||||
(TOC - TIC).total_seconds()))
|
||||
|
||||
if not ERROR:
|
||||
exit(0)
|
||||
else:
|
||||
exit(1)
|
||||
except KeyboardInterrupt:
|
||||
exit(2)
|
||||
Reference in New Issue
Block a user