Sto lavorando su un programma LOC + 10k, e ho bisogno di assicurarmi che il suo output sia sempre lo stesso per un dato input. Il programma consiste di dozzine di moduli e classi, ereditati da MainClass
. (Gli esempi di seguito sono molto semplificati rispetto al codice reale.)
Inizialmente ho creato test per garantire che più istanze di MainClass
avessero lo stesso risultato per un dato input.
def check_consistent_instances(input_dict):
"""Checks if all results for given input are the same."""
first_instance_result = MainClass(input_dict).result()
for i in range(10000):
result = MainClass(input_dict).result()
if first_instance_result != result:
raise Exception('Different result detected!!')
Questo tuttavia non può rilevare risultati diversi in più esecuzioni causate da insiemi / dettare con un ordine diverso a causa di un nuovo hash seed in ogni esecuzione (questo potrebbe in alcuni rari casi influenzare l'output).
Ad esempio:
class MyClass(object):
AVAILABLE_MONEY = 6
ITEMS_CATALOG = {'a': 5, 'b': 5, 'c': 5, 'd': 5, 'e': 3}
def buy_most_expensive(self):
"""Deducts the most expensive items from the available money."""
for i in self.ITEMS_CATALOG:
# Assume I made a mistake here! I should have used sorted(self.ITEMS_CATALOG, key=lambda x: self.ITEMS_CATALOG[x])
# but accidentally i used only self.ITEMS_CATALOG.
cost = self.ITEMS_CATALOG[i]
if cost <= self.AVAILABLE_MONEY:
self.AVAILABLE_MONEY -= cost
Il codice come sopra passerebbe il mio check_consistent_instances()
test, poiché su ogni esecuzione il PYTHONHASHSEED
avrebbe un valore specifico e tutti i risultati sarebbero gli stessi durante un'esecuzione specifica . I risultati sarebbero diversi solo tra diverse esecuzioni.
Domanda:
Quali sono le migliori pratiche quando si tratta di verificare se i risultati di un programma sono coerenti?