We test software in order to check for the existence of defects or errors in a program or project, based up on some predefined instructions or conditions. One of the most important issues in the software testing is the generation of the test cases. It is difficult to create test cases when a system may exhibit a different response depending on concurrent conditions or previous state. In this case, that aspect of the system can be shown as activity diagrams. Activity diagrams look at the workflow of the system typically with flow charts. In order to generate test cases based on activity diagrams, we propose a methodology which reduces test cases and solves concurrency problems. More specifically, we propose an $\It{ I/O Explicit Activity Diagram}$ which is reconstructed from UML activity diagrams. Next, we transform the $\It{ I/O Explicit Activity Diagram}$ into a directed graph which is the central conceptual tool of testing. For those conversions, we adopted three principles: black box testing principle (takes an external perspective of test object to derive test cases), $\It{single stimulus principle}$, and $\It{slow environment principle}$. This methodology can handle the concurrency problems when synchronizations occur in the system by nullifying events (implicit operations) which trigger state changes to UML activity diagrams. The approach presented in this thesis demonstrates a systematic method to generate test cases according to path coverage criteria for UML activity diagrams. Thus it can save the testing cost and reduce the probability of mistakes.