New reliability models are derived to describe how test-based software reliability estimates depend on the component structure of code. The models can analyze dependent component failures. Models of this type are important for two main reasons. Firstly, they provide a quality model for software development based on component reuse. For simple software architectures, it is shown that it is feasible to re-use evidence of a component's reliability from previous testing/usage in a different system. This technique has potential to provide extremely efficient software verification. Secondly, the new models provide a meaning for 'reliable software design,' making it possible to identify software designs whose reliability can be demonstrated. Traditionally, the complexity of a computation is measured in terms of the number of elemental computations used. In contrast, a statistical complexity measure is proposed to describe complexity in terms of statistical software testability. A highly complex program requires intense testing in order to justify a claim that the program achieves a given level of reliability. A low complexity program requires less testing to achieve the same claim.