dssg / aequitas

Bias Auditing & Fair ML Toolkit
http://www.datasciencepublicpolicy.org/aequitas/
MIT License
677 stars 113 forks source link

Unit and Integration Testing #155

Open reluzita opened 8 months ago

reluzita commented 8 months ago

The aim of this issue is to develop a robust and effective unit and integration testing strategy.

We need to:

valmik-patel commented 7 months ago

https://github.com/dssg/aequitas/pull/175

I created this draft PR to add testing to the library using pytest. Currently, the script will run tests defined in the tests folder and output a coverage report. This script can be easily added to GitHub actions to ensure that all tests are passing before a PR is merged.

PS: I had to update the version of one of the libraries because the tests were failing on the previous version.

Current coverage report:

---------- coverage: platform darwin, python 3.9.16-final-0 ----------
Name                                                                        Stmts   Miss  Cover
-----------------------------------------------------------------------------------------------
src/aequitas/__init__.py                                                        3      0   100%
src/aequitas/audit.py                                                         108     84    22%
src/aequitas/bias.py                                                          263    201    24%
src/aequitas/fairness.py                                                      104     22    79%
src/aequitas/flow/__init__.py                                                   2      2     0%
src/aequitas/flow/datasets/__init__.py                                          4      4     0%
src/aequitas/flow/datasets/baf.py                                             107    107     0%
src/aequitas/flow/datasets/dataset.py                                          50     50     0%
src/aequitas/flow/datasets/folktables.py                                      127    127     0%
src/aequitas/flow/datasets/generic.py                                         100    100     0%
src/aequitas/flow/evaluation/__init__.py                                        8      8     0%
src/aequitas/flow/evaluation/fairness.py                                       22     22     0%
src/aequitas/flow/evaluation/performance.py                                     9      9     0%
src/aequitas/flow/experiment/__init__.py                                        3      3     0%
src/aequitas/flow/experiment/_configs.py                                       25     25     0%
src/aequitas/flow/experiment/default.py                                        39     39     0%
src/aequitas/flow/experiment/experiment.py                                    155    155     0%
src/aequitas/flow/methods/__init__.py                                           4      4     0%
src/aequitas/flow/methods/base_estimator/__init__.py                            5      5     0%
src/aequitas/flow/methods/base_estimator/base_estimator.py                     18     18     0%
src/aequitas/flow/methods/base_estimator/lightgbm.py                           26     26     0%
src/aequitas/flow/methods/base_estimator/logistic_regression.py                37     37     0%
src/aequitas/flow/methods/base_estimator/neural_network.py                     84     84     0%
src/aequitas/flow/methods/base_estimator/random_forest.py                      37     37     0%
src/aequitas/flow/methods/inprocessing/__init__.py                              3      3     0%
src/aequitas/flow/methods/inprocessing/fairgbm.py                              16     16     0%
src/aequitas/flow/methods/inprocessing/fairlearn_classifier.py                 53     53     0%
src/aequitas/flow/methods/inprocessing/inprocessing.py                         10     10     0%
src/aequitas/flow/methods/postprocessing/__init__.py                            5      5     0%
src/aequitas/flow/methods/postprocessing/balanced_group_threshold.py           67     67     0%
src/aequitas/flow/methods/postprocessing/group_threshold.py                    23     23     0%
src/aequitas/flow/methods/postprocessing/identity.py                           10     10     0%
src/aequitas/flow/methods/postprocessing/postprocessing.py                     10     10     0%
src/aequitas/flow/methods/postprocessing/threshold.py                          50     50     0%
src/aequitas/flow/methods/preprocessing/__init__.py                             3      3     0%
src/aequitas/flow/methods/preprocessing/correlation_suppression.py             48     48     0%
src/aequitas/flow/methods/preprocessing/data_repairer.py                       43     43     0%
src/aequitas/flow/methods/preprocessing/feature_importance_suppression.py      48     48     0%
src/aequitas/flow/methods/preprocessing/identity.py                            12     12     0%
src/aequitas/flow/methods/preprocessing/label_flipping.py                     104    104     0%
src/aequitas/flow/methods/preprocessing/massaging.py                           45     45     0%
src/aequitas/flow/methods/preprocessing/preprocessing.py                       16     16     0%
src/aequitas/flow/methods/preprocessing/prevalence_sample.py                   81     81     0%
src/aequitas/flow/optimization/__init__.py                                    157    157     0%
src/aequitas/flow/plots/__init__.py                                             0      0   100%
src/aequitas/flow/plots/bootstrap/__init__.py                                   2      2     0%
src/aequitas/flow/plots/bootstrap/plot.py                                      42     42     0%
src/aequitas/flow/plots/bootstrap/visualize.py                                 48     48     0%
src/aequitas/flow/plots/pareto/__init__.py                                      2      2     0%
src/aequitas/flow/plots/pareto/plot.py                                        125    125     0%
src/aequitas/flow/plots/pareto/visualize.py                                    62     62     0%
src/aequitas/flow/utils/__init__.py                                             6      6     0%
src/aequitas/flow/utils/colab.py                                               33     33     0%
src/aequitas/flow/utils/config.py                                              28     28     0%
src/aequitas/flow/utils/evaluation.py                                          88     88     0%
src/aequitas/flow/utils/imports.py                                             16     16     0%
src/aequitas/flow/utils/labeled_frame.py                                       19     19     0%
src/aequitas/flow/utils/logging.py                                             59     59     0%
src/aequitas/flow/utils/metrics.py                                              6      6     0%
src/aequitas/flow/utils/results.py                                             45     45     0%
src/aequitas/group.py                                                         127     44    65%
src/aequitas/plot/__init__.py                                                   5      0   100%
src/aequitas/plot/bubble_concatenation_chart.py                                26     12    54%
src/aequitas/plot/bubble_disparity_chart.py                                   144    117    19%
src/aequitas/plot/bubble_metric_chart.py                                      119     95    20%
src/aequitas/plot/commons/__init__.py                                           0      0   100%
src/aequitas/plot/commons/helpers.py                                           21     12    43%
src/aequitas/plot/commons/initializers.py                                      76     64    16%
src/aequitas/plot/commons/labels.py                                             7      0   100%
src/aequitas/plot/commons/legend.py                                            27     18    33%
src/aequitas/plot/commons/metrics.py                                            2      0   100%
src/aequitas/plot/commons/scales.py                                            33     25    24%
src/aequitas/plot/commons/style/__init__.py                                     0      0   100%
src/aequitas/plot/commons/style/classes.py                                     86      0   100%
src/aequitas/plot/commons/style/color.py                                       19      0   100%
src/aequitas/plot/commons/style/sizes.py                                       39      0   100%
src/aequitas/plot/commons/style/text.py                                         8      0   100%
src/aequitas/plot/commons/tooltips.py                                          18     14    22%
src/aequitas/plot/commons/validators.py                                        69     57    17%
src/aequitas/plot/summary_chart.py                                            131    104    21%
src/aequitas/plot/xy_metrics_chart.py                                          91     73    20%
src/aequitas/plotting.py                                                      653    598     8%
src/aequitas/preprocessing.py                                                  50     23    54%
src/aequitas/squarify_flipped.py                                              119    102    14%
src/aequitas/version.py                                                         1      0   100%
-----------------------------------------------------------------------------------------------
TOTAL                                                                        4596   3912    15%