  Errors in quantum programs are challenging to track down due to the
uncertainty of quantum programs. Testing is, therefore, an indispensable method
for assuring the quality of quantum software. Existing testing methods focus
only on testing quantum programs with quantum circuits or single subroutines
and, therefore, cannot effectively test quantum programs with
multi-subroutines. In this paper, we first discuss several critical issues that
must be considered when testing multi-subroutine quantum programs and point out
the limitations and problems with existing testing methods. We then present a
novel framework for testing multi-subroutine quantum programs that allow for
both unit and integration testing. Our framework includes two novel test
coverage criteria for the equivalent class partition of quantum variables to
guide our testing tasks and techniques to test quantum programs with several
common patterns. We also discuss how to generate test cases based on our
framework. To evaluate the effectiveness of our testing framework, we
implemented a tool called QSharpTester for testing Q\# programs with multiple
subroutines. We used it to conduct experiments on hundreds of mutation programs
deriving from seven original Q\# programs. The experimental results show that
our testing methods can deal with broader types of quantum programs than
existing ones and perform well on almost all faulty mutation programs.
