* add py test

* update dependencies and markers

* Update ci.yml

* fix linting

* trying with editable install for cov

* fix code smells

* fix code smells

Co-authored-by: xianghe ma <maxianghe@outlook.com>
Этот коммит содержится в:
Inga Ulusoy 2022-10-27 11:17:42 +02:00 коммит произвёл GitHub
родитель 9b3e3796fa
Коммит 27732c5fab
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
14 изменённых файлов: 239 добавлений и 23 удалений

6
.github/workflows/ci.yml поставляемый
Просмотреть файл

@ -27,13 +27,13 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install .
python -m pip install -e .
- name: Run pytest
run: |
cd misinformation
python -m pytest -s --cov=. --cov-report=xml
python -m pytest -s -m "not imageai" --cov=. --cov-report=xml
- name: Upload coverage
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3
with:
fail_ci_if_error: true
files: misinformation/coverage.xml

Просмотреть файл

@ -0,0 +1 @@
{"IMG_2746": {"filename": "./test/data/IMG_2746.png", "face": "Yes", "multiple_faces": "Yes", "no_faces": 11, "wears_mask": ["No", "No", "Yes"], "age": [36, 35, 33], "gender": ["Man", "Man", "Man"], "race": ["white", "white", null], "emotion": [["sad", 73.24262697950762], ["fear", 84.20094847679138], null], "emotion (category)": ["Negative", "Negative", null]}}

Просмотреть файл

@ -0,0 +1 @@
{"IMG_2746": {"filename": "./test/data/IMG_2809.png", "person": "yes", "bicycle": "no", "car": "yes", "motorcycle": "no", "airplane": "no", "bus": "yes", "train": "no", "truck": "no", "boat": "no", "traffic light": "no", "cell phone": "no"}}

Просмотреть файл

@ -1,14 +1 @@
{
"filename": "./test/data/IMG_2809.png",
"person": "yes",
"bicycle": "no",
"car": "yes",
"motorcycle": "no",
"airplane": "no",
"bus": "yes",
"train": "no",
"truck": "no",
"boat": "no",
"traffic light": "no",
"cell phone": "no"
}
{"filename": "./test/data/IMG_2809.png", "person": "yes", "bicycle": "no", "car": "yes", "motorcycle": "no", "airplane": "no", "bus": "yes", "train": "no", "truck": "no", "boat": "no", "traffic light": "no", "cell phone": "no"}

Просмотреть файл

@ -0,0 +1,14 @@
{
"filename": "./test/data/IMG_2809.png",
"person": "yes",
"bicycle": "yes",
"car": "yes",
"motorcycle": "no",
"airplane": "no",
"bus": "yes",
"train": "no",
"truck": "no",
"boat": "no",
"traffic light": "no",
"cell phone": "no"
}

Просмотреть файл

@ -1 +0,0 @@
{'image_objects': {'filename': './misinformation/test/data/IMG_2809.png', 'person': 'yes', 'bicycle': 'yes', 'car': 'yes', 'motorcycle': 'no', 'airplane': 'no', 'bus': 'yes', 'train': 'no', 'truck': 'no', 'boat': 'no', 'traffic light': 'no', 'cell phone': 'no'}}

Двоичные данные
misinformation/test/data/pic1.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 671 KiB

Двоичные данные
misinformation/test/data/pic2.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 272 KiB

3
misinformation/test/pytest.ini Обычный файл
Просмотреть файл

@ -0,0 +1,3 @@
[pytest]
markers =
imageai: mark a test related to imageai.

63
misinformation/test/test_cropposts.py Обычный файл
Просмотреть файл

@ -0,0 +1,63 @@
import misinformation.cropposts as crpo
import numpy as np
from PIL import Image
TEST_IMAGE_1 = "./test/data/pic1.png"
TEST_IMAGE_2 = "./test/data/pic2.png"
def test_matching_points():
ref_view = np.array(Image.open(TEST_IMAGE_2))
view = np.array(Image.open(TEST_IMAGE_1))
filtered_matches, kp1, kp2 = crpo.matching_points(ref_view, view)
assert len(filtered_matches) > 0
def test_kp_from_matches():
ref_view = np.array(Image.open(TEST_IMAGE_2))
view = np.array(Image.open(TEST_IMAGE_1))
filtered_matches, kp1, kp2 = crpo.matching_points(ref_view, view)
kp1, kp2 = crpo.kp_from_matches(filtered_matches, kp1, kp2)
assert kp1.shape[0] == len(filtered_matches)
assert kp2.shape[0] == len(filtered_matches)
assert kp1.shape[1] == 2
assert kp2.shape[1] == 2
def test_compute_crop_corner():
ref_view = np.array(Image.open(TEST_IMAGE_2))
view = np.array(Image.open(TEST_IMAGE_1))
filtered_matches, kp1, kp2 = crpo.matching_points(ref_view, view)
corner = crpo.compute_crop_corner(filtered_matches, kp1, kp2)
print(view.shape)
print(corner)
assert corner is not None
v, h = corner
assert 0 <= v < view.shape[0]
assert 0 <= h < view.shape[0]
def test_crop_posts_image():
ref_view = np.array(Image.open(TEST_IMAGE_2))
view = np.array(Image.open(TEST_IMAGE_1))
rte = crpo.crop_posts_image(ref_view, view)
assert rte is not None
crop_view, match_num = rte
assert match_num > 0
assert crop_view.shape[0] * crop_view.shape[1] <= view.shape[0] * view.shape[1]
def test_crop_posts_from_refs():
ref_view = np.array(Image.open(TEST_IMAGE_2))
view = np.array(Image.open(TEST_IMAGE_1))
ref_views = [ref_view]
crop_view = crpo.crop_posts_from_refs(ref_views, view)
assert crop_view.shape[0] * crop_view.shape[1] <= view.shape[0] * view.shape[1]
def test_get_file_list():
ref_list = []
ref_dir = "./test/data"
ref_list = crpo.get_file_list(ref_dir, ref_list, ext="png")
assert len(ref_list) > 0

33
misinformation/test/test_display.py Обычный файл
Просмотреть файл

@ -0,0 +1,33 @@
import json
from misinformation.display import explore_analysis
from pytest import approx
def test_explore_analysis_faces():
mydict = {"IMG_2746": {"filename": "./test/data/IMG_2746.png"}}
explore_analysis(mydict, identify="faces")
with open("./test/data/example_analysis_faces.json", "r") as file:
outs = json.load(file)
for im_key in mydict.keys():
sub_dict = mydict[im_key]
for key in sub_dict.keys():
if key != "emotion":
assert sub_dict[key] == outs[im_key][key]
# json can't handle tuples natively
for i in range(0, len(sub_dict["emotion"])):
temp = (
list(sub_dict["emotion"][i])
if type(sub_dict["emotion"][i]) == tuple
else sub_dict["emotion"][i]
)
assert approx(temp) == outs[im_key]["emotion"][i]
def test_explore_analysis_objects():
mydict = {"IMG_2746": {"filename": "./test/data/IMG_2809.png"}}
explore_analysis(mydict, identify="objects")
with open("./test/data/example_analysis_objects.json", "r") as file:
outs = json.load(file)
assert str(mydict) == str(outs)

Просмотреть файл

@ -1,9 +1,17 @@
import json
import pytest
import misinformation
import misinformation.objects as ob
import misinformation.objects_cvlib as ob_cvlib
# import misinformation.objects_imageai as ob_iai
OBJECT_1 = "cell phone"
OBJECT_2 = "motorcycle"
OBJECT_3 = "traffic light"
TEST_IMAGE_1 = "./test/data/IMG_2809.png"
JSON_1 = "./test/data/example_objects_cvlib.json"
JSON_2 = "./test/data/example_objects_imageai.json"
@pytest.fixture()
def default_objects():
@ -11,7 +19,7 @@ def default_objects():
def test_objects_from_cvlib(default_objects):
objects_list = ["cell phone", "motorcycle", "traffic light"]
objects_list = [OBJECT_1, OBJECT_2, OBJECT_3]
objects = ob_cvlib.objects_from_cvlib(objects_list)
out_objects = default_objects
for obj in objects_list:
@ -21,11 +29,113 @@ def test_objects_from_cvlib(default_objects):
def test_analyse_image_cvlib():
mydict = {"filename": "./test/data/IMG_2809.png"}
mydict = {"filename": TEST_IMAGE_1}
ob_cvlib.ObjectCVLib().analyse_image(mydict)
with open("./test/data/example_objects_cvlib.json", "r") as file:
with open(JSON_1, "r") as file:
out_dict = json.load(file)
for key in mydict.keys():
print(key)
assert mydict[key] == out_dict[key]
def test_init_default_objects():
default_obj_list = [
"person",
"bicycle",
"car",
OBJECT_2,
"airplane",
"bus",
"train",
"truck",
"boat",
OBJECT_3,
OBJECT_1,
]
init_objects = ob_cvlib.init_default_objects()
for obj in default_obj_list:
assert init_objects[obj] == "no"
def test_analyse_image_from_file_cvlib():
file_path = TEST_IMAGE_1
objs = ob_cvlib.ObjectCVLib().analyse_image_from_file(file_path)
with open(JSON_1, "r") as file:
out_dict = json.load(file)
for key in objs.keys():
assert objs[key] == out_dict[key]
def test_detect_objects_cvlib():
file_path = TEST_IMAGE_1
objs = ob_cvlib.ObjectCVLib().detect_objects_cvlib(file_path)
with open(JSON_1, "r") as file:
out_dict = json.load(file)
for key in objs.keys():
assert objs[key] == out_dict[key]
@pytest.mark.imageai
def test_objects_from_imageai(default_objects):
objects_list = [OBJECT_1, OBJECT_2, OBJECT_3]
objs_input = [
{"name": OBJECT_1},
{"name": OBJECT_2},
{"name": OBJECT_3},
]
objects = ob_iai.objects_from_imageai(objs_input) # noqa: F821
out_objects = default_objects
for obj in objects_list:
out_objects[obj] = "yes"
assert str(objects) == str(out_objects)
@pytest.mark.imageai
def test_analyse_image_from_file_imageai():
file_path = TEST_IMAGE_1
objs = ob_iai.ObjectImageAI().analyse_image_from_file(file_path) # noqa: F821
with open(JSON_2, "r") as file:
out_dict = json.load(file)
for key in objs.keys():
assert objs[key] == out_dict[key]
@pytest.mark.imageai
def test_detect_objects_imageai():
file_path = TEST_IMAGE_1
objs = ob_iai.ObjectImageAI().detect_objects_imageai(file_path) # noqa: F821
with open(JSON_2, "r") as file:
out_dict = json.load(file)
for key in objs.keys():
assert objs[key] == out_dict[key]
@pytest.mark.imageai
def test_analyse_image_imageai():
mydict = {"filename": TEST_IMAGE_1}
ob_iai.ObjectImageAI().analyse_image(mydict) # noqa: F821
with open(JSON_2, "r") as file:
out_dict = json.load(file)
for key in mydict.keys():
assert mydict[key] == out_dict[key]
def test_set_keys(default_objects):
mydict = {"filename": TEST_IMAGE_1}
key_objs = ob.ObjectDetector(mydict).set_keys()
assert str(default_objects) == str(key_objs)
def test_analyse_image():
mydict = {"filename": TEST_IMAGE_1}
ob.ObjectDetector.set_client_to_cvlib()
ob.ObjectDetector(mydict).analyse_image()
with open(JSON_1, "r") as file:
out_dict = json.load(file)
assert str(mydict) == str(out_dict)

Просмотреть файл

@ -37,6 +37,9 @@ dependencies = [
"openpyxl",
"pytest",
"pytest-cov",
"matplotlib",
"pytest",
"opencv-contrib-python",
]
[project.scripts]

Просмотреть файл

@ -14,3 +14,5 @@ keras
openpyxl
pytest
pytest-cov
matplotlib
opencv-contrib-python