diff --git a/modules/mol/alg/tests/test_ligand_scoring.py b/modules/mol/alg/tests/test_ligand_scoring.py
index 4a13ed256791414323e3d72551f231b2f5159930..877bfa6eb68af9a41c4c09c39b419244acedd0b5 100644
--- a/modules/mol/alg/tests/test_ligand_scoring.py
+++ b/modules/mol/alg/tests/test_ligand_scoring.py
@@ -51,10 +51,10 @@ class TestLigandScoring(unittest.TestCase):
 
         sc = LigandScorer(mdl, trg, None, None)
 
-        assert len(sc.target_ligands) == 7
-        assert len(sc.model_ligands) == 1
-        assert len([r for r in sc.target.residues if r.is_ligand]) == 7
-        assert len([r for r in sc.model.residues if r.is_ligand]) == 1
+        self.assertEqual(len(sc.target_ligands),  7)
+        self.assertEqual(len(sc.model_ligands), 1)
+        self.assertEqual(len([r for r in sc.target.residues if r.is_ligand]), 7)
+        self.assertEqual(len([r for r in sc.model.residues if r.is_ligand]), 1)
 
     def test_init_given_ligands(self):
         """Test that we can instantiate the scorer with ligands contained in
@@ -68,29 +68,29 @@ class TestLigandScoring(unittest.TestCase):
         mdl_lig = [mdl.Select("rname=G3D")]
         sc = LigandScorer(mdl, trg, mdl_lig, trg_lig)
 
-        assert len(sc.target_ligands) == 4
-        assert len(sc.model_ligands) == 1
+        self.assertEqual(len(sc.target_ligands), 4)
+        self.assertEqual(len(sc.model_ligands), 1)
         # IsLigand flag should still be set even on not selected ligands
-        assert len([r for r in sc.target.residues if r.is_ligand]) == 7
-        assert len([r for r in sc.model.residues if r.is_ligand]) == 1
+        self.assertEqual(len([r for r in sc.target.residues if r.is_ligand]), 7)
+        self.assertEqual(len([r for r in sc.model.residues if r.is_ligand]), 1)
 
         # Ensure the residues are not copied
-        assert len(sc.target.Select("rname=MG").residues) == 2
-        assert len(sc.target.Select("rname=G3D").residues) == 2
-        assert len(sc.model.Select("rname=G3D").residues) == 1
+        self.assertEqual(len(sc.target.Select("rname=MG").residues), 2)
+        self.assertEqual(len(sc.target.Select("rname=G3D").residues), 2)
+        self.assertEqual(len(sc.model.Select("rname=G3D").residues), 1)
 
         # Pass residue handles
         trg_lig = [trg.FindResidue("F", 1), trg.FindResidue("H", 1)]
         mdl_lig = [mdl.FindResidue("L_2", 1)]
         sc = LigandScorer(mdl, trg, mdl_lig, trg_lig)
 
-        assert len(sc.target_ligands) == 2
-        assert len(sc.model_ligands) == 1
+        self.assertEqual(len(sc.target_ligands), 2)
+        self.assertEqual(len(sc.model_ligands), 1)
 
         # Ensure the residues are not copied
-        assert len(sc.target.Select("rname=ZN").residues) == 1
-        assert len(sc.target.Select("rname=G3D").residues) == 2
-        assert len(sc.model.Select("rname=G3D").residues) == 1
+        self.assertEqual(len(sc.target.Select("rname=ZN").residues), 1)
+        self.assertEqual(len(sc.target.Select("rname=G3D").residues), 2)
+        self.assertEqual(len(sc.model.Select("rname=G3D").residues), 1)
 
     def test_init_sdf_ligands(self):
         """Test that we can instantiate the scorer with ligands from separate SDF files.
@@ -116,11 +116,11 @@ class TestLigandScoring(unittest.TestCase):
         # Pass entities
         sc = LigandScorer(mdl, trg, mdl_ligs, trg_ligs)
 
-        assert len(sc.target_ligands) == 7
-        assert len(sc.model_ligands) == 1
+        self.assertEqual(len(sc.target_ligands), 7)
+        self.assertEqual(len(sc.model_ligands), 1)
         # Ensure we set the is_ligand flag
-        assert len([r for r in sc.target.residues if r.is_ligand]) == 7
-        assert len([r for r in sc.model.residues if r.is_ligand]) == 1
+        self.assertEqual(len([r for r in sc.target.residues if r.is_ligand]), 7)
+        self.assertEqual(len([r for r in sc.model.residues if r.is_ligand]), 1)
 
         # Pass residues
         mdl_ligs_res = [mdl_ligs[0].residues[0]]
@@ -128,8 +128,8 @@ class TestLigandScoring(unittest.TestCase):
 
         sc = LigandScorer(mdl, trg, mdl_ligs_res, trg_ligs_res)
 
-        assert len(sc.target_ligands) == 7
-        assert len(sc.model_ligands) == 1
+        self.assertEqual(len(sc.target_ligands), 7)
+        self.assertEqual(len(sc.model_ligands), 1)
 
     def test_init_reject_duplicate_ligands(self):
         """Test that we reject input if multiple ligands with the same chain
@@ -159,16 +159,16 @@ class TestLigandScoring(unittest.TestCase):
         mdl_lig = _LoadEntity("P84080_model_02_ligand_0.sdf")
 
         graph = ligand_scoring._ResidueToGraph(mdl_lig.residues[0])
-        assert len(graph.edges) == 34
-        assert len(graph.nodes) == 32
+        self.assertEqual(len(graph.edges), 34)
+        self.assertEqual(len(graph.nodes), 32)
         # Check an arbitrary node
-        assert [a for a in graph.adj["14"].keys()] == ["13", "29"]
+        self.assertEqual([a for a in graph.adj["14"].keys()], ["13", "29"])
 
         graph = ligand_scoring._ResidueToGraph(mdl_lig.residues[0], by_atom_index=True)
-        assert len(graph.edges) == 34
-        assert len(graph.nodes) == 32
+        self.assertEqual(len(graph.edges), 34)
+        self.assertEqual(len(graph.nodes), 32)
         # Check an arbitrary node
-        assert [a for a in graph.adj[13].keys()] == [12, 28]
+        self.assertEqual([a for a in graph.adj[13].keys()], [12, 28])
 
     def test__ComputeSymmetries(self):
         """Test that _ComputeSymmetries works.
@@ -183,15 +183,15 @@ class TestLigandScoring(unittest.TestCase):
         mdl_g3d = mdl.FindResidue("L_2", 1)
 
         sym = ligand_scoring._ComputeSymmetries(mdl_g3d, trg_g3d1)
-        assert len(sym) == 72
+        self.assertEqual(len(sym), 72)
 
         sym = ligand_scoring._ComputeSymmetries(mdl_g3d, trg_g3d1, by_atom_index=True)
-        assert len(sym) == 72
+        self.assertEqual(len(sym), 72)
 
         # Test that we can match ions read from SDF
         sdf_lig = _LoadEntity("1r8q_ligand_0.sdf")
         sym = ligand_scoring._ComputeSymmetries(trg_mg1, sdf_lig.residues[0], by_atom_index=True)
-        assert len(sym) == 1
+        self.assertEqual(len(sym), 1)
 
         # Test that it works with views and only consider atoms in the view
         # Skip PA, PB and O[1-3]A and O[1-3]B in target and model
@@ -202,14 +202,14 @@ class TestLigandScoring(unittest.TestCase):
         mdl_g3d_sub = mdl_g3d_sub_ent.residues[0]
 
         sym = ligand_scoring._ComputeSymmetries(mdl_g3d_sub, trg_g3d1_sub)
-        assert len(sym) == 6
+        self.assertEqual(len(sym), 6)
 
         sym = ligand_scoring._ComputeSymmetries(mdl_g3d_sub, trg_g3d1_sub, by_atom_index=True)
-        assert len(sym) == 6
+        self.assertEqual(len(sym), 6)
 
         # Substructure matches
         sym = ligand_scoring._ComputeSymmetries(mdl_g3d, trg_g3d1_sub, substructure_match=True)
-        assert len(sym) == 6
+        self.assertEqual(len(sym), 6)
 
         # Missing atoms only allowed in target, not in model
         with self.assertRaises(NoSymmetryError):
@@ -272,7 +272,7 @@ class TestLigandScoring(unittest.TestCase):
         sc._compute_scores()
 
         # Check RMSD
-        assert sc.rmsd_matrix.shape == (7, 1)
+        self.assertEqual(sc.rmsd_matrix.shape, (7, 1))
         np.testing.assert_almost_equal(sc.rmsd_matrix, np.array(
             [[np.nan],
             [0.04244993],
@@ -372,23 +372,23 @@ class TestLigandScoring(unittest.TestCase):
 
         # Local by default
         sc = LigandScorer(mdl, trg, None, None)
-        assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'A': 'A'}
-        assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'}
+        self.assertEqual(sc.rmsd_details["L_2"][1]["chain_mapping"], {'A': 'A'})
+        self.assertEqual(sc.lddt_pli_details["L_2"][1]["chain_mapping"], {'C': 'A'})
 
         # Global
         sc = LigandScorer(mdl, trg, None, None, global_chain_mapping=True)
-        assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'C': 'A'}
-        assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'}
+        self.assertEqual(sc.rmsd_details["L_2"][1]["chain_mapping"], {'C': 'A'})
+        self.assertEqual(sc.lddt_pli_details["L_2"][1]["chain_mapping"], {'C': 'A'})
 
         # Custom
         sc = LigandScorer(mdl, trg, None, None, global_chain_mapping=True, custom_mapping={'A': 'A'})
-        assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'A': 'A'}
-        assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'A': 'A'}
+        self.assertEqual(sc.rmsd_details["L_2"][1]["chain_mapping"], {'A': 'A'})
+        self.assertEqual(sc.lddt_pli_details["L_2"][1]["chain_mapping"], {'A': 'A'})
 
         # Custom only active with global chain mapping
         sc = LigandScorer(mdl, trg, None, None, global_chain_mapping=False, custom_mapping={'A': 'A'})
-        assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'A': 'A'}
-        assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'}
+        self.assertEqual(sc.rmsd_details["L_2"][1]["chain_mapping"], {'A': 'A'})
+        self.assertEqual(sc.lddt_pli_details["L_2"][1]["chain_mapping"], {'C': 'A'})
 
     def test_rmsd_assignment(self):
         """Test that the RMSD-based assignment works.
@@ -407,7 +407,7 @@ class TestLigandScoring(unittest.TestCase):
 
         # RMSD assignment forces the same assignment
         sc = LigandScorer(mdl, trg, None, None, rmsd_assignment=True)
-        assert sc.rmsd_details["L_2"][1]["target_ligand"] == sc.lddt_pli_details["L_2"][1]["target_ligand"]
+        self.assertEqual(sc.rmsd_details["L_2"][1]["target_ligand"], sc.lddt_pli_details["L_2"][1]["target_ligand"])
 
     def test_ignore_binding_site(self):
         """Test that we ignore non polymer stuff in the binding site.
@@ -419,7 +419,7 @@ class TestLigandScoring(unittest.TestCase):
         sc = LigandScorer(trg, trg, None, None)
         expected_bs_ref_res = ['C.GLY62', 'C.GLN63', 'C.ASP64', 'C.PRO65', 'C.TYR66', 'C.CYS76', 'C.PHE77', 'C.ASN123', 'C.HIS187']
         ost.PushVerbosityLevel(ost.LogLevel.Error)
-        assert [str(r) for r in sc.rmsd_details["D"][1]["bs_ref_res"]] == expected_bs_ref_res
+        self.assertEqual([str(r) for r in sc.rmsd_details["D"][1]["bs_ref_res"]], expected_bs_ref_res)
         ost.PopVerbosityLevel()
 
     def test_unassigned_reasons(self):
@@ -504,24 +504,24 @@ class TestLigandScoring(unittest.TestCase):
         # Check unassigned targets
         # NA: not in contact with target
         trg_na = sc.target.FindResidue("L_NA", 1)
-        assert sc.unassigned_target_ligands["L_NA"][1] == "binding_site"
+        self.assertEqual(sc.unassigned_target_ligands["L_NA"][1], "binding_site")
         # ZN: no representation
         trg_zn = sc.target.FindResidue("H", 1)
-        assert sc.unassigned_target_ligands["H"][1] == "model_representation"
+        self.assertEqual(sc.unassigned_target_ligands["H"][1], "model_representation")
         # AFB: not identical to anything in the model
         trg_afb = sc.target.FindResidue("G", 1)
-        assert sc.unassigned_target_ligands["G"][1] == "identity"
+        self.assertEqual(sc.unassigned_target_ligands["G"][1], "identity")
         # F.G3D1: J.G3D1 assigned instead
         trg_fg3d1 = sc.target.FindResidue("F", 1)
-        assert sc.unassigned_target_ligands["F"][1] == "stoichiometry"
+        self.assertEqual(sc.unassigned_target_ligands["F"][1], "stoichiometry")
         # CMO: disconnected
         trg_cmo1 = sc.target.FindResidue("L_CMO", 1)
-        assert sc.unassigned_target_ligands["L_CMO"][1] == "disconnected"
+        self.assertEqual(sc.unassigned_target_ligands["L_CMO"][1], "disconnected")
         # J.G3D1: assigned to L_2.G3D1 => error
         trg_jg3d1 = sc.target.FindResidue("J", 1)
         with self.assertRaises(RuntimeError):
             sc._find_unassigned_target_ligand_reason(trg_jg3d1)
-        assert "J" not in sc.unassigned_target_ligands
+        self.assertNotIn("J", sc.unassigned_target_ligands)
         # Raises with an invalid ligand
         with self.assertRaises(ValueError):
             sc._find_unassigned_target_ligand_reason(sc.model_ligands[0])
@@ -529,28 +529,28 @@ class TestLigandScoring(unittest.TestCase):
         # Check unassigned models
         # OXY: not identical to anything in the model
         mdl_oxy = sc.model.FindResidue("L_OXY", 1)
-        assert sc.unassigned_model_ligands["L_OXY"][1] == "identity"
-        assert sc.lddt_pli["L_OXY"][1] is None
+        self.assertEqual(sc.unassigned_model_ligands["L_OXY"][1], "identity")
+        self.assertIsNone(sc.lddt_pli["L_OXY"][1])
         # NA: not in contact with target
         mdl_na = sc.model.FindResidue("L_NA", 1)
-        assert sc.unassigned_model_ligands["L_NA"][1] == "binding_site"
-        assert sc.lddt_pli["L_NA"][1] is None
+        self.assertEqual(sc.unassigned_model_ligands["L_NA"][1], "binding_site")
+        self.assertIsNone(sc.lddt_pli["L_NA"][1])
         # ZN: no representation
         mdl_zn = sc.model.FindResidue("L_ZN", 1)
-        assert sc.unassigned_model_ligands["L_ZN"][1] == "model_representation"
-        assert sc.lddt_pli["L_ZN"][1] is None
+        self.assertEqual(sc.unassigned_model_ligands["L_ZN"][1], "model_representation")
+        self.assertIsNone(sc.lddt_pli["L_ZN"][1])
         # MG in L_MG_2 has stupid coordinates and is not assigned
         mdl_mg_2 = sc.model.FindResidue("L_MG_2", 1)
-        assert sc.unassigned_model_ligands["L_MG_2"][1] == "stoichiometry"
-        assert sc.lddt_pli["L_MG_2"][1] is None
+        self.assertEqual(sc.unassigned_model_ligands["L_MG_2"][1], "stoichiometry")
+        self.assertIsNone(sc.lddt_pli["L_MG_2"][1])
         # MG in L_MG_0: assigned to I.MG1 => error
         mdl_mg_0 = sc.model.FindResidue("L_MG_0", 1)
         with self.assertRaises(RuntimeError):
             sc._find_unassigned_model_ligand_reason(mdl_mg_0)
-        assert "L_MG_0" not in sc.unassigned_model_ligands
+        self.assertNotIn("L_MG_0", sc.unassigned_model_ligands)
         # CMO: disconnected
         mdl_cmo1 = sc.model.FindResidue("L_CMO", 1)
-        assert sc.unassigned_model_ligands["L_CMO"][1] == "disconnected"
+        self.assertEqual(sc.unassigned_model_ligands["L_CMO"][1], "disconnected")
         # Raises with an invalid ligand
         with self.assertRaises(ValueError):
             sc._find_unassigned_model_ligand_reason(sc.target_ligands[0])
@@ -558,37 +558,37 @@ class TestLigandScoring(unittest.TestCase):
         # Should work with rmsd_assignment too
         sc = LigandScorer(mdl, trg, None, None, unassigned=True,
                           rmsd_assignment=True)
-        assert sc.unassigned_model_ligands == {
+        self.assertEqual(sc.unassigned_model_ligands, {
             'L_ZN': {1: 'model_representation'},
             'L_NA': {1: 'binding_site'},
             'L_OXY': {1: 'identity'},
             'L_MG_2': {1: 'stoichiometry'},
             "L_CMO": {1: 'disconnected'}
-        }
-        assert sc.unassigned_target_ligands == {
+        })
+        self.assertEqual(sc.unassigned_target_ligands, {
             'G': {1: 'identity'},
             'H': {1: 'model_representation'},
             'J': {1: 'stoichiometry'},
             'K': {1: 'identity'},
             'L_NA': {1: 'binding_site'},
             "L_CMO": {1: 'disconnected'}
-        }
-        assert sc.lddt_pli["L_OXY"][1] is None
+        })
+        self.assertIsNone(sc.lddt_pli["L_OXY"][1])
 
         # With missing ligands
         sc = LigandScorer(mdl.Select("cname=A"), trg, None, None)
-        assert sc.unassigned_target_ligands["E"][1] == 'no_ligand'
+        self.assertEqual(sc.unassigned_target_ligands["E"][1], 'no_ligand')
 
         sc = LigandScorer(mdl, trg.Select("cname=A"), None, None)
-        assert sc.unassigned_model_ligands["L_2"][1] == 'no_ligand'
+        self.assertEqual(sc.unassigned_model_ligands["L_2"][1], 'no_ligand')
 
         sc = LigandScorer(mdl.Select("cname=A"), trg, None, None,
                           unassigned=True, rmsd_assignment=True)
-        assert sc.unassigned_target_ligands["E"][1] == 'no_ligand'
+        self.assertEqual(sc.unassigned_target_ligands["E"][1], 'no_ligand')
 
         sc = LigandScorer(mdl, trg.Select("cname=A"), None, None,
                           unassigned=True, rmsd_assignment=True)
-        assert sc.unassigned_model_ligands["L_2"][1] == 'no_ligand'
+        self.assertEqual(sc.unassigned_model_ligands["L_2"][1], 'no_ligand')
 
         # However not everything must be missing
         with self.assertRaises(ValueError):
@@ -614,7 +614,7 @@ class TestLigandScoring(unittest.TestCase):
         sc = LigandScorer(mdl.Select("protein=True"), trg.Select("protein=True"),
                           model_ligands=[mdl_g3d], target_ligands=[trg_g3d1_sub],
                           substructure_match=True)
-        assert sc.rmsd_details["L_2"][1]["coverage"] == 0.75
+        self.assertEqual(sc.rmsd_details["L_2"][1]["coverage"], 0.75)
 
     def test_6jyf(self):
         """6JYF initially caused issues in the CASP15-CAMEO/LIGATE paper where
@@ -629,19 +629,19 @@ class TestLigandScoring(unittest.TestCase):
         # Problem is easily fixed by just prioritizing full coverage
         sc = LigandScorer(mdl, trg, model_ligands=[mdl_lig],
                           substructure_match=True)
-        assert sc.rmsd_details['00001_'][1]["coverage"] == 1.0
-        assert sc.rmsd_details['00001_'][1]["target_ligand"].name == "RET"
+        self.assertEqual(sc.rmsd_details['00001_'][1]["coverage"], 1.0)
+        self.assertEqual(sc.rmsd_details['00001_'][1]["target_ligand"].name, "RET")
         self.assertAlmostEqual(sc.rmsd['00001_'][1], 15.56022, 4)
-        assert np.array_equal(sc.coverage_matrix,
-                              np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.3, 0.45, 0, 0, 0.55]]).transpose())
+        self.assertTrue(np.array_equal(sc.coverage_matrix,
+                              np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.3, 0.45, 0, 0, 0.55]]).transpose()))
 
         # We need to make sure that it also works if the match is partial.
         # For that we load the complete ligand incl. the O missing in target
         # with a coverage of around 95% only.
         sc = LigandScorer(mdl, trg, model_ligands=[mdl_lig_full],
                           substructure_match=True)
-        assert sc.rmsd_details['00001_'][1]["coverage"] > 0.95
-        assert sc.rmsd_details['00001_'][1]["target_ligand"].name == "RET"
+        self.assertTrue(sc.rmsd_details['00001_'][1]["coverage"] > 0.95)
+        self.assertEqual(sc.rmsd_details['00001_'][1]["target_ligand"].name, "RET")
         self.assertAlmostEqual(sc.rmsd['00001_'][1], 15.56022, 4)
 
         # Next, we check that coverage_delta has an effect. With a large
@@ -650,8 +650,8 @@ class TestLigandScoring(unittest.TestCase):
         sc = LigandScorer(mdl, trg, model_ligands=[mdl_lig_full],
                           substructure_match=True,
                           coverage_delta=0.5)
-        assert sc.rmsd_details['00001_'][1]["coverage"] > 0.5
-        assert sc.rmsd_details['00001_'][1]["target_ligand"].name == "OLA"
+        self.assertTrue(sc.rmsd_details['00001_'][1]["coverage"] > 0.5)
+        self.assertEqual(sc.rmsd_details['00001_'][1]["target_ligand"].name, "OLA")
         self.assertAlmostEqual(sc.rmsd['00001_'][1], 6.13006878, 4)
 
         # Finally, we check that we still assign to the full match even with
@@ -659,8 +659,8 @@ class TestLigandScoring(unittest.TestCase):
         sc = LigandScorer(mdl, trg, model_ligands=[mdl_lig],
                           substructure_match=True,
                           coverage_delta=0.5)
-        assert sc.rmsd_details['00001_'][1]["coverage"] == 1.0
-        assert sc.rmsd_details['00001_'][1]["target_ligand"].name == "RET"
+        self.assertEqual(sc.rmsd_details['00001_'][1]["coverage"], 1.0)
+        self.assertEqual(sc.rmsd_details['00001_'][1]["target_ligand"].name, "RET")
         self.assertAlmostEqual(sc.rmsd['00001_'][1], 15.56022, 4)