--- /dev/null
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+name: sample
+description: sample benchmark plan for testing default path
+config:
+  collectors: []
+  reporters: []
+QPIs: []
 
 
 
 class LogItem(BaseActor):
-    def find(self, filename, paths=None):
-        return self._parent.find(filename, paths)
+    def find(self, filename):
+        return self._parent.find(filename)
 
 
 class LogfileCollector(BaseActor):
         self._parent = parent  # plan
         # TODO(yujunz) handle exception of invalid parent
         dirname = os.path.dirname(self._parent.abspath)
-        paths = [os.path.join(dirname, p) for p in config.get(self.PATHS, [])]
-        self._loader = FileLoader('.', paths)
+        self.paths = [os.path.join(dirname, p) for p in config.get(self.PATHS, [])]
 
     def run(self):
         collected = []
             collected = chain(collected, reduce(chain, matches))
         return reduce(merge_matchobj_to_dict, collected, {'groups': (), 'groupdict': {}})
 
-    def find(self, filename, paths=None):
-        return self._loader.find(filename, paths)
+    def find(self, filename):
+        return FileLoader.find(filename, self.paths)
 
 
 def merge_matchobj_to_dict(d, m):
 
         self._filename = name
         self.abspath = self.find(name, paths=paths)
 
-    def find(self, name, paths=None):
+    @classmethod
+    def find(cls, name, paths=None):
         """find a specification in searching paths"""
-        paths = [self.abspath] if paths is None else paths
+        paths = cls._paths if paths is None else paths
         for p in paths:
-            abspath = path.join(p, self.RELATIVE_PATH, name)
+            abspath = path.join(p, cls.RELATIVE_PATH, name)
             if path.exists(abspath):
                 return abspath
         raise NotFoundError(name, paths)
 
--- /dev/null
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+name: sample
+description: sample benchmark plan for testing default path
+config:
+  collectors: []
+  reporters: []
+QPIs: []
 
 from qtip.loader.plan import load_collector
 from qtip.loader.plan import Plan
 from qtip.loader.plan import PlanProp
-from qtip.loader.plan import QPISpec
 
 
-def test_init(plan):
-    assert plan.name == 'doctor performance profiling'
-    assert isinstance(plan.content, dict)
-    for qpi in plan.qpis:
-        assert isinstance(qpi, QPISpec)
+def test_construct(benchmarks_root):
+    sample = Plan('sample.yaml')
+    assert isinstance(sample, Plan)
 
+    # fixture can not be used in pytest.mark.parametrized
+    sample = Plan('sample.yaml', [benchmarks_root])
+    assert isinstance(sample, Plan)
+
+
+def test_invalid_construct():
     with pytest.raises(TypeError) as excinfo:
         Plan()
     assert '__init__() takes at least 2 arguments (1 given)' \
 
 def test_list_all(benchmarks_root):
     plan_list = list(Plan.list_all(paths=[benchmarks_root]))
-    assert len(plan_list) is 2
+    assert len(plan_list) is 3
     for desc in plan_list:
         assert PlanProp.NAME in desc
         assert PlanProp.ABSPATH in desc