Por que os atributos de teste de unidade geralmente exigem métodos públicos?

12

Recentemente, observei que a adição de [TestInitialize] a um método protegido em um assembly .NET não era respeitada, mas se eu tornasse o método público, ele seria chamado pelo executor de teste de unidade (Resharper neste caso). Eu notei isso várias vezes no passado com métodos de teste.

Tecnicamente falando, é tão fácil refletir sobre um método privado quanto um método público. De fato, a reflexão é um método empregado para testar métodos particulares.

Então, por que preciso tornar públicos todos os meus métodos de teste de unidade?

Justin Dearing
fonte
2
Essa é uma pergunta muito boa. O único argumento bom que ouvi é que ele segue o princípio "programa para uma interface, não para uma implementação", parte dos princípios do SOLID.
Robert Harvey
9
Eu não acho que ele está falando sobre testar suas classes, ele está falando sobre os métodos de teste reais que são chamados pela estrutura de teste.
JTiger
1
@RobertHarvey em Java, razão pela restrição semelhante (por exemplo, em JUnit) é que os designers quadro não quer mexer com setAccessibleo que pode ser bloqueada por algum costume SecurityManager
mosquito
1
você precisa levar em conta que esta decisão de design foi tomada para uma estrutura de uso geral direcionada para uso amplo. Em casos como esse, é mais seguro para o designer assumir e se preparar para o pior. Se era, eu não sei, alguma estrutura interna da empresa (onde é possível ter chance de garantir as políticas de segurança desejadas) ou se era alguma ferramenta de finalidade restrita e especializada (pense em "visualizador para membros inacessíveis"), designer teria outras opções a considerar
mosquito
2
@ GregBurghardt Esse comportamento é encontrado na Nunit e provavelmente em outras estruturas de teste que a Microsoft não escreveu. Certamente, desde os anos seguintes a essa pergunta, eu entendo muito mais sobre o .NET, mas ainda acho que é uma pergunta justa, e há uma boa discussão nos comentários.
Justin Dearing

Respostas:

2

Você deve testar o que a classe faz , não como ela faz.

No que diz respeito ao "Mundo Exterior", é isso que a classe disponibiliza Publicamente; sua estrutura de teste está fazendo a mesma suposição.

Ao testar algo "menos" que Público, você está investigando a implementação interna da classe, o que é uma Má Idéia.

Phill W.
fonte
Observe que a pergunta é sobre os métodos de teste, e não os métodos no sistema em teste. Embora seja verdade que o OP argumenta que você pode usar a reflexão para testar as coisas "menos" que o público, é um argumento sobre a capacidade das estruturas de teste de acessar métodos privados. A estrutura de teste deve usar a reflexão para encontrar os métodos de teste (marcados por um atributo) e, portanto, deve usar a reflexão, com isso em mente ... "por que preciso tornar públicos todos os meus métodos de teste de unidade?"
precisa saber é o seguinte
Os métodos de teste têm a capacidade de acessar métodos privados; com Reflexão, tudo é possível. Vejo essa pergunta mais sobre a [in] conveniência de fazê-lo.
Phill W.
0

Como regra geral, é melhor acessar apenas métodos públicos - quando você cria uma classe, também cria o contrato para o qual outras classes devem acessar seu código. Portanto, a resposta provavelmente é apenas porque é uma convenção.

Vetle
fonte
1
Isso realmente não responde à pergunta.
precisa