Why can't I access the public variables of the children class of TestItem in this syntax? I only have access to TestItem variables

//used to retrieve an item by name
Dictionary<string, TestItem> itemDatabase = new Dictionary<string, TestItem>();
//used to retrieve an item by number. great for random item generation
Dictionary<int, TestItem> itemDatabaseInt = new Dictionary<int, TestItem>();

    void Start()
    {
        CreateItemDatabase();
    }

    void CreateItemDatabase()
    {
        TestItem item;

        item = new TestConsumable();
        item.Name = "Health Potion";
        item.Icon = Resources.Load<Sprite>("Icons/" + item.Name) as Sprite;
        itemDatabase.Add(item.Name, item);
        itemDatabaseInt.Add(0, item);

        item = new TestConsumable();
        item.Name = "Mana Potion";
        item.Icon = Resources.Load<Sprite>("Icons/" + item.Name) as Sprite;
        itemDatabase.Add(item.Name, item);
        itemDatabaseInt.Add(1, item);

        item = new TestWeapon();
        item.Name = "Short Sword";
        item.Icon = Resources.Load<Sprite>("Icons/" + item.Name) as Sprite;
        itemDatabase.Add(item.Name, item);
        itemDatabaseInt.Add(2, item);

        item = new TestShield();
        item.Name = "Kite Shield";
        item.Icon = Resources.Load<Sprite>("Icons/" + item.Name) as Sprite;
        itemDatabase.Add(item.Name, item);
        itemDatabaseInt.Add(3, item);

    }

Your problem is that item is your base class and even though this is valid

TestItem item;
item = new TestWeapon();

because TestWeapon is a descendant of TestItem, this is invalid

item.atkType = AtkType.Sword;

because TestItem does not have a member atkType. What you can do however is this

((TestWeapon)item).atkType = AtkType.Sword;

or this

// more preferred
TestWeapon weapon = new TestWeapon();
weapon.atkType = AtkType.Sword;