andbin ha scritto:
centurione_agrippa ha scritto:
Il metodo dovrebbe dare come risultato per ogni materia il nome del ragazzo col voto più alto
Bene. Pensando ai casi di test a me, così al volo, vengono in mente questi (supponendo le tue 4 persone e 3 materie):
- un caso in cui una sola persona è migliore in tutte le materie
- un caso in cui una persona è migliore in 2 materie e un'altra persona è migliore nella terza materia
- un caso in cui tre persone distinte sono migliori in ciascuna delle tre materie
Avevi pensato a questi? Poi ci sarebbero anche i casi dei fallimenti per questioni "tecniche" di incoerenza tra i dati. Cosa ci si vuole aspettare se hai 5 nomi di persona ma l'array dei voti ha solo 4 righe? (ArrayIndexOutOfBound è quello che succederebbe con il tuo codice e si può anche testare).
Questo in sostanza vuol dire che i nomi delle materie e delle persone possono anche restare sempre quelli. Mentre per l'array voto dovrai per forza crearne diversi con dati differenti per fare i vari casi.
Se fai caso, i nomi delle materie NON sono importanti. Sono solo concettualmente correlati ai voti per indice. Mentre invece i nomi delle persone sono importanti perché li usi sia per impostare l'array dei nomi sia poi per testare l'array in uscita da migliori().
Per i nomi delle persone è meglio mettere delle costanti es.
public static final String MARIO = "Mario";
Questo ti permette di scrivere sempre correttamente i nomi (un IDE tra l'altro ti può fare l'autocompletamento mentre scrivi) e ti evita di "cannare" un test solo perché magari nel setup hai scritto "Mario" e nel test del risultato hai testato "Marlo" per sbaglio.
Ora prova, per dubbi, chiedi ovviamente.
Per i casi di test avevo pensato a 3 che falliscono e tre che hanno successo. I casi sono:
1)Fallisce per un voto negativo (tipo -5,-7);
2)Fallisce per un voto non compreso tra 0 e 10;
3)Fallisce quando non è presente il voto della materia dell'alunno;
4)Successo quando il voto inserito è compreso tra 0 e 10;
5)Successo quando restituisce per ogni materia il nome dello studente con il miglior voto;
6)Successo quando sono stati inseriti tutti i voti per tutti gli alunni e per tutte le materie;
I suoi casi test credo che siano più incentrati al metodo e credo che sia anche giusto. Non mi è ben chiaro la questione delle costanti, ho cercato di sistemare un po di cose in questo modo:
public class Registro {
private String[] nome;
private double[][] voto;
private String[] materia;
public Registro(String[]nome,double[][] voto, String[] materia){
this.nome=nome;
this.voto=voto;
this.materia=materia;
}
public String[] getNome() {
return nome;
}
public void setNome(String[] nome) {
this.nome = nome;
}
public double[][] getVoto() {
return voto;
}
public void setVoto(double[][] voto) {
this.voto = voto;
}
public String[] getMateria() {
return materia;
}
public void setMateria(String[] materia) {
this.materia = materia;
}
public String[] migliori(){
String[] migliore;
int r = this.nome.length;
int c = this.materia.length;
migliore = new String[c];
for (int j=0; j<c; j++){
double max = this.voto[0][j];
migliore[j]= this.nome[0];
for (int i=1; i<r; i++)
if (this.voto[i][j] > max){
max = this.voto[i][j];
migliore[j] = this.nome[i];
}
}
return migliore;
}
}
public class RegistroTest {
double voto [][] ={{7,8,6.5},
{4,5,7 },
{9,7,6 },
{3,5,6 }};
String nomeoutput[]={"Luigi","Marco","Nicola"};
String nome[]={"Luigi","Marco","Nicola","Renato"};
String materia[]={"Inf","Elettr","Stor"};
@Test
public void testMigliori(){
Registro reg = new Registro(nome,voto,materia);
reg.setNome(nome);
reg.setMateria(materia);
reg.setVoto(voto);
assertArrayEquals(reg.migliori(),nomeoutput);
}
}
Il test fallisce