rstudio / rstudio/pins-python

Organize test suite into classes

Open
#257 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

testing
Dominant language
Python
Stars
59
Forks
11
PR merge metrics
No merged PRs in 30d

Description

Currently tests are organized into modules and then separated into sections using comment rules e.g.

# pin_download ===================================================================

This can make it hard to navigate the test suite and also results in longer test names: the test names include both the category information and the specifics of the test.

Pytest allows you to organize tests into classes. Besides adding some clarity to the test organization, this also allows the user to have more fine-grained control about which tests run.

So I would propose changing the following:

# pin_write ===================================================================

def test_board_pin_write_default_title(board):

    df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
    meta = board.pin_write(df, "df_csv", title=None, type="csv")
    assert meta.title == "df_csv: a pinned 3 x 2 DataFrame"


def test_board_pin_write_prepare_pin(board, tmp_dir2):

    df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})

    meta = board.prepare_pin_version(
        str(tmp_dir2), df, "df_csv", title=None, type="csv"
    )
    assert meta.file == "df_csv.csv"
    assert (tmp_dir2 / "data.txt").exists()
    assert (tmp_dir2 / "df_csv.csv").exists()
    assert not (tmp_dir2 / "df_csv.csv").is_dir()


def test_board_pin_write_roundtrip(board):

    df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})

    assert not board.pin_exists("df_csv")

    board.pin_write(df, "df_csv", type="csv")

    assert board.pin_exists("df_csv")

    loaded_df = board.pin_read("df_csv")
    assert loaded_df.equals(df)


def test_board_pin_write_type_not_specified_error(board):
    class C:
        pass

    with pytest.raises(NotImplementedError):
        board.pin_write(C(), "cool_pin")

To this:

class TestBoard:
    ... # All the other sets of tests on pins.board.BaseBoard methods...
    class TestPinWrite:
        def test_default_title(self, board):
        
            df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
            meta = board.pin_write(df, "df_csv", title=None, type="csv")
            assert meta.title == "df_csv: a pinned 3 x 2 DataFrame"
        
        
        def test_prepare_pin(self, board, tmp_dir2):
        
            df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
        
            meta = board.prepare_pin_version(
                str(tmp_dir2), df, "df_csv", title=None, type="csv"
            )
            assert meta.file == "df_csv.csv"
            assert (tmp_dir2 / "data.txt").exists()
            assert (tmp_dir2 / "df_csv.csv").exists()
            assert not (tmp_dir2 / "df_csv.csv").is_dir()
        
        
        def test_roundtrip(self, board):
        
            df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
        
            assert not board.pin_exists("df_csv")
        
            board.pin_write(df, "df_csv", type="csv")
        
            assert board.pin_exists("df_csv")
        
            loaded_df = board.pin_read("df_csv")
            assert loaded_df.equals(df)
        
        
        def test_type_not_specified_error(self, board):
            class C:
                pass
        
            with pytest.raises(NotImplementedError):
                board.pin_write(C(), "cool_pin")
        
        ... # etc.

My plan for making this change would be one test file at a time.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Begin with the test file containing the pin_write section for pins.board.BaseBoard, then identify the other comment-separated test sections one file at a time. Convert those sections into nested test classes and shorten method names while preserving the existing assertions and fixtures. Run the affected pytest file after each conversion and confirm the full suite still passes.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.