Incorporating testing effort and dynamic learning effects in software reliability growth models and release time determination