自作したプログラムの単体テストの何が足りないのかわからないです。

実現したいこと

プログラムについての質問ではなく、プログラムを作った後の話です。
自作したお会計システムをもとに単体テストを作りたく試行錯誤をしています。
単体テストの作成経験がないため、いろんなサイトを見て、見様見真似で作ってみたのですが、うまくいっておりません。
作成した単体テストを見て、何が足りないのか、どういった観点が足りないのかを教えていただきたいです。
ソースコードで変なところを見つけたら教えていただきたいです。

前提

c言語でシステムを作成しております。ソースは長いものになっているため、mainがあるソースファイルのみ掲載させていただきます。ヘッダも載せておきます。

list.h

1#ifndef __LIST 2#define __LIST 3 4#define ITEM_NAME 1 5#define ITEM_PRICE 2 6#define ITEM_QUANTITY 3 7 8#define NAME_MAX_LENGTH 21 9#define PRICE_MAX_LENGTH 9 10#define QUANTITY_MAX_LENGTH 9 11 12#define SUCCESS 0 13#define ERROR -1 14 15 16#define SELECT 0 17#define ADD 1 18#define DELETE 2 19#define LIST 3 20#define TOTAL 4 21#define HISTORY 5 22#define END 6 23#define NODATA 7 24#define NOTSELECT 8 25typedef struct{ 26 char name[NAME_MAX_LENGTH]; 27 unsigned int price; 28 unsigned int quantity; 29}Item; 30 31typedef struct node{ 32 Item data; 33 struct node* next; 34 struct node* prev; 35}Node; 36 37/*main.c*/ 38int selectFunction(); 39void displayScreen(int); 40void displaySelectedFunction(int); 41void flushBuffer();//_これだけが変(済) 42 43/*add.c*/ 44void addItemData(Node**, Node**); 45void getItemString(char*, char*); 46int getItemName(Item *item); 47void getItemPrice(Item *item); 48void getItemQuantity(Item *item); 49Node* createNode(); 50 51/*delete.c*/ 52int deleteItem(Node **head, Node **tail); 53char* getDeleteItem(); 54int checkItemData(Node *head); 55 56/*print.c*/ 57int displayItemList(Node*); 58int getNumberOfDisplay(); 59 60/*total.c*/ 61int checkout(Node**, Node**); 62int calculateTotal(Node*); 63void clearCart(Node**, Node**); 64 65/*history.c*/ 66void history(); 67int displayPurchaseHistory(); 68 69/*finalize.c*/ 70void finalize(Node*); 71 72#endif /*__LIST*/ 73

main.c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <unistd.h> 5#include "list.h" 6 7/* Function : main 8 * Summary : functional transition 9 * Argument : 10 * Return : int 11 */ 12int main(){ 13 14 int function; 15 Node *head = NULL; 16 Node *tail = NULL; 17 18 while(1){ 19 20 function = selectFunction(head); 21 switch(function){ 22 case ADD:/*追加*/ 23 addItemData(&head, &tail); 24 break; 25 26 case DELETE:/*削除*/ 27 deleteItem(&head, &tail); 28 break; 29 30 case LIST:/*一覧*/ 31 displayItemList(head); 32 break; 33 34 case TOTAL:/*会計*/ 35 checkout(&head, &tail); 36 break; 37 38 case HISTORY:/*履歴*/ 39 history(); 40 break; 41 42 case END:/*終了*/ 43 finalize(head); 44 break; 45 46 case NODATA:/*Nが選ばれたらから読み*/ 47 printf("機能選択画面に戻ります\n"); 48 break; 49 50 default: 51 printf("条件外の入力数値です。\n"); 52 } 53 54 if(function == END){ 55 break; 56 } 57 } 58 59 return 0; 60} 61 62 63 64/* Function : flushBuffer 65 * Summary : clear buffer 66 * Argument : 67 * Return : 68 */ 69void flushBuffer(){ 70 int c; 71 while((c = getchar()) != '\n' && c != EOF) 72 ; 73} 74 75 76/* Function : checkItemData 77 * Summary : check to se if data is available 78 * Argument : Node* head (read only) 79 * Return : int 80 */ 81/*NULLであれば,0を返す。違うのであれば,1を返す。*/ 82int checkItemData(Node *head){ 83 return head == NULL; 84} 85 86 87/* Function : displayScreen 88 * Summary : screen output 89 * Argument : int screenNumber (Read only) 90 * Return : 91 */ 92void displayScreen(int screenNumber){ 93 94 switch(screenNumber){ 95 case SELECT://ここを名前付けるべき 96 printf("\n(1)商品をカゴに追加\n"); 97 printf("(2)商品を削除\n"); 98 printf("(3)カゴの商品一覧\n"); 99 printf("(4)お会計\n"); 100 printf("(5)購入履歴\n"); 101 printf("(6)終了\n\n"); 102 printf("機能番号を入力して下さい\n"); 103 printf("機能番号:"); 104 break; 105 106 case ADD: 107 printf("<<商品追加>>\n"); 108 printf("商品名、商品価格、商品個数を入力していただきます\n"); 109 break; 110 111 case DELETE: 112 printf("<<商品削除>>\n"); 113 printf("追加した商品を削除することができます\n"); 114 break; 115 116 case LIST: 117 printf("<<追加商品一覧>>\n"); 118 printf("追加した商品を見ることができます\n"); 119 break; 120 121 case TOTAL: 122 printf("<<お会計>>\n"); 123 printf("追加した商品をお会計します\n"); 124 break; 125 126 case HISTORY: 127 printf("<<購入履歴>>\n"); 128 printf("お会計した過去の商品を見ることができます\n"); 129 break; 130 131 case END: 132 printf("ご利用ありがとうございました。\n"); 133 break; 134 135 case NODATA: 136 printf("商品がありません。\n"); 137 printf("機能選択画面に戻ります。\n"); 138 printf("----------\n"); 139 sleep(2); 140 break; 141 142 default: 143 printf("条件外の入力がされています。\n"); 144 } 145} 146 147 148/* Function : displaySelectedFunction 149 * Summary : output screen of selected function 150 * Argument : int selectNumber (read only) 151 * Return : 152 */ 153void displaySelectedFunction(int selectNumber){ 154 switch(selectNumber){ 155 case ADD: 156 printf("<(1)商品をカゴに追加>"); 157 break; 158 159 case DELETE: 160 printf("<(2)商品を削除>"); 161 break; 162 163 case LIST: 164 printf("<(3)カゴの商品一覧>"); 165 break; 166 167 case TOTAL: 168 printf("<(4)お会計>"); 169 break; 170 171 case HISTORY: 172 printf("<(5)購入履歴>"); 173 break; 174 175 case END: 176 printf("<(6)終了>"); 177 break; 178 //defaultは入れるべき。 179 180 default: 181 printf("条件外の入力がされています。\n"); 182 } 183} 184 185 186/* Function : selectFunction 187 * Summary : enter the function number and determine 188 * Argument : 189 * Return : int 190 */ 191int selectFunction(Node *head){ 192 unsigned int selectNumber; 193 194 while(1){ 195 displayScreen(SELECT); 196 scanf("%1d", &selectNumber); 197 flushBuffer(); 198 199 if(selectNumber >= 1 && selectNumber <= 6){ 200 break; 201 }else{ 202 printf("**1から6の半角整数を入力してください。再入力してください。**\n"); 203 continue; 204 } 205 } 206 207 char yOrN; 208 209 while(1){ 210 printf("下記の機能番号が入力されました。\n"); 211 printf("機能番号:%d\n", selectNumber); 212 displaySelectedFunction(selectNumber); 213 printf("を使用しますか?\n"); 214 printf("Y/N:"); 215 216 scanf("%1c", &yOrN); 217 flushBuffer(); 218 219 if(yOrN == 'Y' || yOrN == 'y'){ 220 /*データの有無を確認する*/ 221 if(selectNumber == ADD || selectNumber == HISTORY || selectNumber == END){ 222 return selectNumber; 223 }else{ 224 if(checkItemData(head)){ 225 displayScreen(NODATA); 226 return NODATA; 227 }else{ 228 return selectNumber; 229 } 230 } 231 }else if(yOrN == 'N' || yOrN == 'n'){ 232 return NOTSELECT; 233 }else{ 234 printf("**半角のy又はnを入力してください**\n"); 235 continue; 236 } 237 } 238}

単体テストの内容

現時点でできている単体テストを載せます。画像かなり小さいと思うので、右クリック->新しいタブで開いてみていただきたいです。
何が足りないのか、本来はこうすべきではないのかという意見がありましたら、コメントお願いいたします。
画像はQiitaに添付しました。

試したこと

上記にあります通り、単体テストを記述してみました。
コメントいただけるとありがたいです。

コメントを投稿

0 コメント