- New shared static helper _equally_spaced_subtomo_angles(), ported from flomni's _subtomo_angle_plan() with the 180/360-degree-range branch removed (OMNY only ever scans 180 degrees). Generalizes the bit-reversal sub-tomogram interleaving to any power-of-two sub-tomogram count; for n_subtomos=2 it reduces to OMNY's original type-1 scheme. - sub_tomo_scan() refactored onto the new helper (gains an n_subtomos param); tomo_type 1 (2 sub-tomograms) is otherwise unchanged. - Adds tomo_type 4 (4 sub-tomograms) and 5 (8 sub-tomograms), gated by the same "wear in OMNY" authorization-code prompt already used for tomo_type 2/3. - Advanced tomo modes (2, 3, 4, 5) are now hidden from tomo_parameters()'s menu unless bec.active_account is in the new _SUPERUSER_ACCOUNTS allowlist; a non-superuser landing on an advanced type is forced back to type 1. _SUPERUSER_ACCOUNTS is left empty -- needs real account codes before anyone can use the advanced modes. - As a side effect of reusing flomni's formula, also fixes a latent bug: the old code derived the inter-sub-tomogram phase offset from the raw configured tomo_angle_stepsize rather than the achievable (int-truncated) step, producing an unevenly-spaced combined grid whenever stepsize didn't divide 180 evenly. - New tests/tests_bec_ipython_client/test_omny_tomo_angles.py: angle-count and no-duplicate-angle checks for n_subtomos in (2, 4, 8), a regression check against the old type-1 formula, an explicit test of the achievable-step fix, a cross-check against flomni's hardcoded N=8 bit-reversal table, and superuser-gating tests (including the full tomo_parameters() interactive flow forcing a non-superuser back to type 1, and a superuser successfully unlocking type 5).
Getting Started with Testing using pytest
BEC is using the pytest framework. It can be installed via
pip install pytest
in your python environment.
We note that pytest is part of the optional-dependencies [dev] of the plugin package.
Introduction
Tests in this package should be stored in the tests directory.
We suggest to sort tests of different submodules, i.e. scans or devices in the respective folder structure, and to folow a naming convention of <test_module_name.py>.
It is mandatory for test files to begin with test_ for pytest to discover them.
To run all tests, navigate to the directory of the plugin from the command line, and run the command
pytest -v --random-order ./tests
Note, the python environment needs to be active.
The additional arg -v allows pytest to run in verbose mode which provides more detailed information about the tests being run.
The argument --random-order instructs pytest to run the tests in random order, which is the default in the CI pipelines.
Test examples
Writing tests can be quite specific for the given function. We recommend writing tests as isolated as possible, i.e. try to test single functions instead of full classes. A very useful class to enable isolated testing is MagicMock. In addition, we also recommend to take a look at the How-to guides from pytest.