diff --git a/cmdb-api/tests/sample.py b/cmdb-api/tests/sample.py
index ca6a6a7..4e7548b 100644
--- a/cmdb-api/tests/sample.py
+++ b/cmdb-api/tests/sample.py
@@ -11,6 +11,16 @@ from api.models.cmdb import (
     CITypeRelation,
     RelationType
 )
+from api.models.acl import User
+
+from api.lib.cmdb.ci_type import CITypeAttributeManager
+from api.lib.cmdb.ci import CIManager, CIRelationManager
+
+
+def force_add_user():
+    from flask import g
+    if not getattr(g, "user", None):
+        g.user = User.query.first()
 
 
 def init_attributes(num=1):
@@ -88,3 +98,38 @@ def fake_attr_value(attr_dict):
         return {attr_name: random.randint(0, 1000) / 3.0}
     elif attr_type == "2":
         return {attr_name: uuid.uuid4().hex[:8]}
+
+
+def init_ci(num=1):
+    # store ci need has user
+    force_add_user()
+    ci_type = init_ci_types(1)[0]
+    attrs = CITypeAttributeManager.get_attributes_by_type_id(ci_type.id)
+    manager = CIManager()
+    result = []
+
+    for i in range(num):
+        ci_id = manager.add(ci_type.name, **fake_attr_value(attrs[0]))
+        result.append(manager.get_ci_by_id_from_db(ci_id))
+
+    return result
+
+
+def init_ci_with_type(ci_types):
+    force_add_user()
+    cis = []
+    manager = CIManager()
+    for ci_type in ci_types:
+        attrs = CITypeAttributeManager.get_attributes_by_type_id(ci_type.id)
+        ci_id = manager.add(ci_type.name, **fake_attr_value(attrs[0]))
+        cis.append(manager.get_ci_by_id_from_db(ci_id))
+    return cis
+
+
+def init_ci_relation():
+    init_ci_type_relation(1)
+    ci_types = CIType.query.all()
+    cis = init_ci_with_type(ci_types)
+    manager = CIRelationManager()
+    cir_id = manager.add(cis[0]['ci_id'], cis[1]['ci_id'])
+    return cir_id
diff --git a/cmdb-api/tests/test_cmdb_ci.py b/cmdb-api/tests/test_cmdb_ci.py
index c381074..b29fb04 100644
--- a/cmdb-api/tests/test_cmdb_ci.py
+++ b/cmdb-api/tests/test_cmdb_ci.py
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
-from .sample import init_ci_types, fake_attr_value
-from api.lib.cmdb.ci_type import CITypeAttributeManager
+from .sample import init_ci_types, fake_attr_value, init_ci
+from api.lib.cmdb.ci_type import CITypeAttributeManager, CITypeManager
 from api.lib.cmdb.ci import CIManager
+from api.models.cmdb import CI
 
 
 def test_create_ci(session, client):
@@ -25,3 +26,64 @@ def test_create_ci(session, client):
     assert ci[attrs[0]["name"]] == fake_value[attrs[0]['name']]
 
 
+def test_update_ci(session, client):
+    ci = init_ci(1)[0]
+    ci_id = ci.get("ci_id")
+    ci_type = CITypeManager.get_ci_types(ci.get("ci_type"))[0]
+    attrs = CITypeAttributeManager.get_attributes_by_type_id(ci_type["id"])
+    url = "/api/v0.1/ci/{}".format(ci_id)
+
+    fake_value = fake_attr_value(attrs[0])
+
+    payload = {**fake_value}
+
+    resp = client.put(url, json=payload)
+
+    assert resp.status_code == 200
+    assert resp.json["ci_id"] == ci_id
+    ci = CIManager().get_ci_by_id_from_db(ci_id)
+    assert ci[attrs[0]['name']] == fake_value[attrs[0]['name']]
+
+
+def test_delete_ci(session, client):
+    ci = init_ci(1)[0]
+    ci_id = ci.get("ci_id")
+    url = "/api/v0.1/ci/{}".format(ci_id)
+
+    resp = client.delete(url)
+
+    assert resp.status_code == 200
+
+    ci_from_db = CI.query.filter_by(id=ci_id).first()
+    assert ci_from_db is None
+
+
+def test_get_ci_by_types(session, client):
+    ci = init_ci(1)[0]
+    ci_type = CITypeManager.get_ci_types(ci.get("ci_type"))[0]
+    url = "/api/v0.1/ci/type/{}".format(ci_type["id"])
+
+    resp = client.get(url)
+    assert resp.status_code == 200
+
+    assert resp.json['cis'][0]['ci_id'] == ci['ci_id']
+
+
+def test_get_ci_by_id(session, client):
+    ci = init_ci(1)[0]
+    url = "/api/v0.1/ci/{}".format(ci["ci_id"])
+
+    resp = client.get(url)
+    assert resp.status_code == 200
+    assert resp.json['ci_id'] == ci['ci_id']
+
+
+def test_get_ci_detail_by_id(session, client):
+    ci = init_ci(1)[0]
+    url = "/api/v0.1/ci/{}/detail".format(ci["ci_id"])
+
+    resp = client.get(url)
+    assert resp.status_code == 200
+    assert resp.json['id'] == ci['ci_id']
+
+
diff --git a/cmdb-api/tests/test_cmdb_ci_realtion.py b/cmdb-api/tests/test_cmdb_ci_realtion.py
index 40a96af..700ae1c 100644
--- a/cmdb-api/tests/test_cmdb_ci_realtion.py
+++ b/cmdb-api/tests/test_cmdb_ci_realtion.py
@@ -1 +1,39 @@
 # -*- coding: utf-8 -*-
+from .sample import init_ci_with_type, init_ci_type_relation, init_ci_relation
+from api.lib.cmdb.ci import CIRelationManager
+from api.models.cmdb import CIRelation, CIType, CI
+
+
+def test_create_ci_relation(session, client):
+    init_ci_type_relation(1)
+    ci_types = CIType.query.all()
+    cis = init_ci_with_type(ci_types)
+
+    url = "/api/v0.1/ci_relations/{}/{}".format(cis[0]['ci_id'], cis[1]['ci_id'])
+
+    resp = client.post(url)
+    assert resp.status_code == 200
+    cr_id = resp.json['cr_id']
+    cr = CIRelation.get_by_id(cr_id)
+    assert cr is not None
+
+
+def test_delte_ci_relation_by_ci_id(session, client):
+    cr_id = init_ci_relation()
+    cis = CI.query.all()
+
+    url = "/api/v0.1/ci_relations/{}/{}".format(cis[0].id, cis[1].id)
+    resp = client.delete(url)
+    assert resp.status_code == 200
+    cr = CIRelation.get_by_id(cr_id)
+    assert cr is None
+
+
+def test_delete_ci_relation_by_id(session, client):
+    cr_id = init_ci_relation()
+    url = "/api/v0.1/ci_relations/{cr_id}".format(cr_id=cr_id)
+    resp = client.delete(url)
+    assert resp.status_code == 200
+    cr = CIRelation.get_by_id(cr_id)
+    assert cr is None
+