É bom ou ruim duplicar dados entre testes e código real? Por exemplo, suponha que eu tenho uma classe Python FooSaver
que salva arquivos com nomes específicos em um determinado diretório:
class FooSaver(object):
def __init__(self, out_dir):
self.out_dir = out_dir
def _save_foo_named(self, type_, name):
to_save = None
if type_ == FOOTYPE_A:
to_save = make_footype_a()
elif type == FOOTYPE_B:
to_save = make_footype_b()
# etc, repeated
with open(self.out_dir + name, "w") as f:
f.write(str(to_save))
def save_type_a(self):
self._save_foo_named(a, "a.foo_file")
def save_type_b(self):
self._save_foo_named(b, "b.foo_file")
Agora, no meu teste, gostaria de garantir que todos esses arquivos foram criados, então quero dizer algo como isto:
foo = FooSaver("/tmp/special_name")
foo.save_type_a()
foo.save_type_b()
self.assertTrue(os.path.isfile("/tmp/special_name/a.foo_file"))
self.assertTrue(os.path.isfile("/tmp/special_name/b.foo_file"))
Embora isso duplique os nomes de arquivos em dois lugares, acho que é bom: me obriga a escrever exatamente o que espero sair do outro lado, adiciona uma camada de proteção contra erros de digitação e geralmente me faz sentir confiante de que as coisas estão funcionando exatamente como eu esperava. Sei que, se mudar a.foo_file
para type_a.foo_file
o futuro, terei que pesquisar e substituir nos meus testes, mas não acho que isso seja muito importante. Prefiro ter alguns falsos positivos se esquecer de atualizar o teste em troca de garantir que meu entendimento do código e dos testes esteja sincronizado.
Um colega de trabalho acha que essa duplicação é ruim e recomendou que eu refatorasse os dois lados para algo assim:
class FooSaver(object):
A_FILENAME = "a.foo_file"
B_FILENAME = "b.foo_file"
# as before...
def save_type_a(self):
self._save_foo_named(a, self.A_FILENAME)
def save_type_b(self):
self._save_foo_named(b, self.B_FILENAME)
e no teste:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Não gosto disso porque não me deixa confiante de que o código esteja fazendo o que eu esperava - acabei de duplicar a out_dir + name
etapa no lado da produção e no lado do teste. Ele não descobrirá um erro no meu entendimento de como +
funciona as strings e não detectará erros de digitação.
Por outro lado, é claramente menos quebradiço do que escrever essas strings duas vezes, e me parece um pouco errado duplicar dados em dois arquivos como esse.
Existe um precedente claro aqui? É bom duplicar constantes nos testes e no código de produção ou é muito quebradiço?