refactor(gapic-generator): harmonize and deduplicate showcase nox test sessions
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 55/100
- Tipo de issue
- Refatoração
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- python
- Domínio
- build-system, testing-qa
Direção de pesquisa
Read packages/gapic-generator/noxfile.py, focusing on showcase_library, run_showcase_unit_tests, and the showcase sessions around lines 397–629. Run the existing Showcase nox sessions before changing them, then verify that unified system and unit runners preserve each listed variant, options, paths, and pytest behavior.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Problem Summary
In packages/gapic-generator/noxfile.py, the test suite for the Showcase client has grown into over 10 distinct showcase_* sessions across system tests and unit tests.
While proto compilation and client generation were previously consolidated into the with showcase_library(...) context manager, the test execution logic inside the context blocks has suffered from copy-paste sprawl:
-
System Tests Duplication:
The sessionsshowcase,showcase_w_rest_async,showcase_mtls, andshowcase_pqc(lines 397–535) each duplicate a ~25-line block of setup, dependency installation, path resolution, andpy.testexecution. There is no sharedrun_showcase_system_tests()helper. Adding a flag, environment override (such as local core installation), or pytest option requires touching 4 separate sessions. -
Unit Tests Session Explosion:
There are 6 distinct unit test sessions (showcase_unit,showcase_unit_w_rest_async,showcase_unit_alternative_templates,showcase_unit_add_iam_methods,showcase_unit_mixins,showcase_unit_alternative_templates_mixinsacross lines 566–629) that simply pass different template options or flags toshowcase_libraryand then callrun_showcase_unit_tests().
This proliferation leads to maintenance drift, inconsistencies in flags, and makes targeted testing harder.
Proposed Refactor
Consolidate the duplicated sessions into unified, maintainable runners using @nox.parametrize or shared helper functions.
1. System Tests Refactor (Consolidate 4+ sessions into 1)
Instead of 4 copy-pasted sessions:
# Before: 4 duplicate sessions (showcase, showcase_w_rest_async, showcase_mtls, showcase_pqc)
@nox.session(python=ALL_PYTHON)
def showcase(session):
with showcase_library(session):
session.install("pytest", "pytest-asyncio<1.0.0")
...
session.run("py.test", ...)
@nox.session(python=ALL_PYTHON)
def showcase_w_rest_async(session):
with showcase_library(session, rest_async_io_enabled=True):
session.install("pytest", "pytest-asyncio<1.0.0")
...
session.run("py.test", ...)
Consolidate into a single parameterized session with a shared runner:
# After: Single parameterized system test session
SYSTEM_VARIANTS = {
"grpc": {"rest_async": False, "extra_args": []},
"rest_async": {"rest_async": True, "extra_args": []},
"mtls": {"rest_async": False, "extra_args": ["--mtls"]},
"pqc": {"rest_async": False, "extra_args": ["--tls"], "test_path": "tests/system/test_pqc.py"},
}
@nox.session(python=ALL_PYTHON)
@nox.parametrize("variant", list(SYSTEM_VARIANTS.keys()))
def showcase_system(session, variant):
"""Run all Showcase system tests through a unified runner."""
config = SYSTEM_VARIANTS[variant]
with showcase_library(session, rest_async_io_enabled=config["rest_async"]):
session.install("pytest", "pytest-asyncio<1.0.0")
if variant == "pqc":
session.install("--upgrade", "grpcio>=1.83.0", "grpcio-status>=1.83.0")
test_path = config.get("test_path", "tests/system")
session.run("py.test", "--quiet", *config["extra_args"], *(session.posargs or [test_path]))
2. Unit Tests Refactor (Consolidate 6 sessions into 1)
Instead of 6 distinct sessions calling run_showcase_unit_tests(), parametrize the template and option configurations:
# After: Single parameterized unit test session
UNIT_CONFIGS = {
"default": {"templates": "DEFAULT", "other_opts": ()},
"rest_async": {"templates": "DEFAULT", "rest_async_io_enabled": True},
"ads_old_naming": {"templates": ADS_TEMPLATES, "other_opts": ("old-naming",)},
"add_iam_methods": {"other_opts": ("add-iam-methods",), "fail_under": 100},
"mixins": {"include_service_yaml": True},
"ads_mixins": {"templates": ADS_TEMPLATES, "other_opts": ("old-naming",), "include_service_yaml": True},
}
@nox.session(python=ALL_PYTHON)
@nox.parametrize("config_name", list(UNIT_CONFIGS.keys()))
def showcase_unit(session, config_name):
"""Run all Showcase unit tests across template configurations."""
cfg = UNIT_CONFIGS[config_name]
with showcase_library(
session,
templates=cfg.get("templates", "DEFAULT"),
other_opts=cfg.get("other_opts", ()),
rest_async_io_enabled=cfg.get("rest_async_io_enabled", False),
include_service_yaml=cfg.get("include_service_yaml", False),
) as lib:
session.chdir(lib)
run_showcase_unit_tests(session, fail_under=cfg.get("fail_under", 100))
Benefits
- Zero Drift: All test invocation logic, constraint handling, and pytest argument handling exist in single shared locations.
- Simplified CI Workflows: Matrix jobs in GitHub Actions can cleanly target
showcase_systemorshowcase_unitwith-k <variant>. - Easier Extensibility: Adding canaries, local dependency overrides, or new transport profiles requires modifying a config dictionary rather than copy-pasting an entire session.
- Linguagem predominante
- Python
- Estrelas
- 5.4k
- Forks
- 1.8k
- Merge médio
- 2d 7h
- PRs com merge (30d)
- 173
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de googleapis/google-cloud-python
-
firestore: field path with a quoted name ending in a backslash is misparsedTalvez já em andamento @sebxt assumiu há 25 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
googleapis/google-cloud-python#18771 ·
Mantenedores costumam responder em até 1 dia
-
api: spanner type: feature request
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
googleapis/google-cloud-python#18584 ·
Mantenedores costumam responder em até 1 dia
-
auth: `impersonated_credentials` loses `subject` on copy, so `with_scopes()` and `with_quota_project()` turn off domain wide delegationTalvez já em andamento @Om-singhaI assumiu há 55 dias. Abertaauth priority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
googleapis/google-cloud-python#18428 ·
Mantenedores costumam responder em até 1 dia
-
A client called `run_in_transaction` be stuck if Spanner is downTalvez já em andamento @founderinaction assumiu há 7 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
googleapis/google-cloud-python#18375 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
ci: enable --strict flag in presubmit twine_checkTalvez livre de novo @ohmayr assumiu há 44 dias e não há nenhum pull request aberto. Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 76/100
googleapis/google-cloud-python#18339 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
Todas as issues de googleapis/google-cloud-python
Issues semelhantes
-
plot_graph crashes when a mesh node has no m2m edgeTalvez já em andamento @tygvi assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
mllam/neural-lam#883 · 1 comentário ·
Mantenedores costumam responder em até 2 dias
-
enhancement possible-duplicate
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 78/100
AOSSIE-Org/PictoPy#1715 · 2 comentários ·
Mantenedores costumam responder em até 6 dias
-
SQLite connector omits generated columns from the catalog, and drops relationships sourced on themAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
NVIDIA/auto-ontology#511 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
ethereum/execution-specs#3996 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
cpp-best-practices/project_validator#267 ·
Mantenedores costumam responder em até 1 dia