Index: python-emmet-core/tests/test_electronic_structure.py
===================================================================
--- python-emmet-core.orig/tests/test_electronic_structure.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/test_electronic_structure.py	2025-02-14 12:14:59.137513932 +0100
@@ -32,6 +32,7 @@
 
 
 def test_from_bsdos_1(bandstructure, dos, structure):
+    pytest.importorskip("seekpath") # pymatgen/symmetry/kpath.py needs SeeK-path Hinuma et al. (2015)
     es_doc = ElectronicStructureDoc.from_bsdos(
         material_id="mp-13",
         dos={"mp-1671247": dos},
@@ -68,8 +69,8 @@
     dos = loadfn(test_dir / "electronic_structure/es_dos_objs.json.gz")
     return dos
 
-
 def test_from_bsdos_2(bandstructure_fs, dos_fs):
+    pytest.importorskip("seekpath") # pymatgen/symmetry/kpath.py needs SeeK-path Hinuma et al. (2015)
     dos = dos_fs[0]["data"]
     bs = bandstructure_fs[0]["data"]
 
Index: python-emmet-core/tests/mobility/test_migrationgraph.py
===================================================================
--- python-emmet-core.orig/tests/mobility/test_migrationgraph.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/mobility/test_migrationgraph.py	2025-02-14 12:14:59.137513932 +0100
@@ -3,8 +3,11 @@
 from monty.serialization import loadfn
 from pymatgen.analysis.structure_matcher import StructureMatcher
 from pymatgen.entries.computed_entries import ComputedEntry
-from emmet.core.mobility.migrationgraph import MigrationGraphDoc
-
+try:
+    from emmet.core.mobility.migrationgraph import MigrationGraphDoc
+except (ModuleNotFoundError,ImportError):
+    pytest.skip(reason="Install pymatgen-analysis-diffusion to use MigrationGraphDoc",
+                allow_module_level=True)
 
 @pytest.fixture(scope="session")
 def get_entries(test_dir):
Index: python-emmet-core/tests/test_robocrys.py
===================================================================
--- python-emmet-core.orig/tests/test_robocrys.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/test_robocrys.py	2025-02-14 12:14:59.137513932 +0100
@@ -9,8 +9,11 @@
 @pytest.mark.parametrize("structure", test_structures.values())
 def test_robocrys(structure: Structure):
     """Very simple test to make sure this actually works"""
-    print(f"Should work : {structure.composition}")
-    doc = RobocrystallogapherDoc.from_structure(
-        structure=structure, material_id=33, deprecated=False
-    )
-    assert doc is not None
+    try:
+        print(f"Should work : {structure.composition}")
+        doc = RobocrystallogapherDoc.from_structure(
+            structure=structure, material_id=33, deprecated=False
+        )
+        assert doc is not None
+    except (ModuleNotFoundError,ImportError):
+        pytest.xfail("requires robocrys")
Index: python-emmet-core/tests/molecules/test_redox.py
===================================================================
--- python-emmet-core.orig/tests/molecules/test_redox.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/molecules/test_redox.py	2025-02-14 12:16:32.606976088 +0100
@@ -38,7 +38,11 @@
 
 @pytest.fixture(scope="session")
 def ie_task(test_dir):
-    task = loadfn((test_dir / "redox_doc" / "ie_task.json").as_posix())
+    pytest.importorskip("custodian")
+    try:
+        task = loadfn((test_dir / "redox_doc" / "ie_task.json").as_posix())
+    except RuntimeError:
+        pytest.skip("openbabel is only available for the default Python version")
     task_doc = TaskDocument(**task)
     return task_doc
 
Index: python-emmet-core/tests/test_ml.py
===================================================================
--- python-emmet-core.orig/tests/test_ml.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/test_ml.py	2025-02-14 12:14:59.137513932 +0100
@@ -1,5 +1,8 @@
 import pytest
 
+# ml requires matcalc, not packaged for debian
+pytest.importorskip("matcalc")
+
 # from matcalc.utils import get_universal_calculator
 from pymatgen.core import Structure
 from pymatgen.util.testing import PymatgenTest
Index: python-emmet-core/tests/test_settings.py
===================================================================
--- python-emmet-core.orig/tests/test_settings.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/test_settings.py	2025-02-14 12:14:59.137513932 +0100
@@ -3,6 +3,8 @@
 from pathlib import PosixPath
 from random import random
 
+import pytest
+
 from monty.serialization import dumpfn, loadfn
 from monty.tempfile import ScratchDir
 
@@ -45,6 +47,7 @@
     assert test_config.ANGLE_TOL == 1.0
 
 
+@pytest.mark.skip("'MPRelaxSet' has no attribute 'config_dict'")
 def test_seriallization():
     test_config = EmmetSettings()
 
Index: python-emmet-core/tests/test_defects.py
===================================================================
--- python-emmet-core.orig/tests/test_defects.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/test_defects.py	2025-02-14 12:14:59.137513932 +0100
@@ -1,4 +1,10 @@
-from emmet.core.defect import DefectTaskDoc
+import pytest
+
+try:
+    from emmet.core.defect import DefectTaskDoc
+except (ModuleNotFoundError,ImportError):
+    pytest.skip(reason="Install pymatgen-analysis-defects to use DefectTaskDoc",
+                allow_module_level=True)
 
 
 def test_parsing_defect_directory(test_dir):
Index: python-emmet-core/tests/molecules/test_bonds.py
===================================================================
--- python-emmet-core.orig/tests/molecules/test_bonds.py	2025-02-14 12:14:59.141513998 +0100
+++ python-emmet-core/tests/molecules/test_bonds.py	2025-02-14 12:14:59.137513932 +0100
@@ -31,11 +31,14 @@
 
 def test_bonding(test_tasks, nbo_task):
     # No Critic2 or NBO
-    ob_mee = MoleculeBondingDoc.from_task(
-        test_tasks[0],
-        molecule_id="b9ba54febc77d2a9177accf4605767db-C1Li2O3-1-2",
-        preferred_methods=["OpenBabelNN + metal_edge_extender"],
-    )
+    try:
+        ob_mee = MoleculeBondingDoc.from_task(
+            test_tasks[0],
+            molecule_id="b9ba54febc77d2a9177accf4605767db-C1Li2O3-1-2",
+            preferred_methods=["OpenBabelNN + metal_edge_extender"],
+        )
+    except RuntimeError:
+        pytest.skip("openbabel is only available for the default Python version")
     assert ob_mee.property_name == "bonding"
     assert ob_mee.method == "OpenBabelNN + metal_edge_extender"
     assert len(ob_mee.bonds) == 12
