Essa idéia simplesmente equivale a um método "Self_Test" dentro do contexto de um design baseado em objeto ou orientado a objeto. Se estiver usando uma linguagem baseada em objeto compilada como Ada, todo o código de autoteste será marcado pelo compilador como não utilizado (nunca invocado) durante a compilação de produção e, portanto, tudo será otimizado - nada disso aparecerá no executável resultante.
Usar um método "Self_Test" é uma idéia extremamente boa, e se os programadores estivessem realmente preocupados com a qualidade, todos estariam fazendo isso. Uma questão importante, porém, é que o método "Self_Test" precisa ter disciplina intensa, pois não pode acessar nenhum detalhe da implementação e deve confiar apenas em todos os outros métodos publicados na especificação do objeto. Obviamente, se o autoteste falhar, a implementação precisará mudar. O autoteste deve estar testando rigorosamente todas as propriedades publicadas dos métodos do objeto, mas nunca confiando em nenhum detalhe de qualquer implementação específica.
Linguagens baseadas em objetos e orientadas a objetos freqüentemente fornecem exatamente esse tipo de disciplina com relação a métodos externos ao objeto testado (eles reforçam a especificação do objeto, impedindo qualquer acesso aos detalhes de sua implementação e gerando um erro de compilação se qualquer tentativa desse tipo for detectada ) Mas todos os métodos internos do objeto têm acesso completo a todos os detalhes da implementação. Portanto, o método de autoteste está em uma situação única: ele precisa ser um método interno devido à sua natureza (o autoteste é obviamente um método do objeto que está sendo testado), mas precisa receber toda a disciplina do compilador de um método externo ( deve ser independente dos detalhes de implementação do objeto). Poucas ou nenhuma linguagem de programação fornece a capacidade de disciplinar um objeto ' s método interno como se fosse um método externo. Portanto, esse é um problema importante de design da linguagem de programação.
Na ausência de suporte adequado à linguagem de programação, a melhor maneira de fazer isso é criar um objeto complementar. Em outras palavras, para cada objeto que você codifica (vamos chamá-lo de "Big_Object"), você também cria um segundo objeto complementar cujo nome consiste em um sufixo padrão concatenado com o nome do objeto "real" (nesse caso, "Big_Object_Self_Test ") e cuja especificação consiste em um único método (" Big_Object_Self_Test.Self_Test (This_Big_Object: Big_Object) retorna Booleano; "). O objeto complementar dependerá da especificação do objeto principal e o compilador aplicará totalmente toda a disciplina dessa especificação contra a implementação do objeto complementar.