Softwares play an important role in controlling complex systems. Monitoring the proper functioning of the components of such systems is the principal role of softwares. Often, a petite fault in one of the subsystems may cause irreparable damages; therefore, it is of great importance to be able to predict software faults and estimate the reliability of softwares. In this survey, we present a classification of various methods proposed in the literature to predict software reliability. This study summarizes the results of more than 200 research papers in the field. We also discuss the challenges involved in prediction methods along with proposed partial solutions (i.e., Bayesian methods) to improve the accuracy of such predictions. Moreover, we review numerous evaluation measures introduced so far to assess the performance of prediction models, the datasets they are based on, and also the results they yield.