The issue is that your graph is has parallel edges so NetworkX is loading it as a MultiGraph object:
In [1]: import networkx as nx
In [2]: G = nx.read_graphml('KeggCompleteEng.graphml')
In [3]: type(G)
Out[3]: networkx.classes.multigraph.MultiGraph
In [4]: G.number_of_edges()
Out[4]: 7123
In [5]: H = nx.Graph(G) # convert to graph, remove parallel edges
In [6]: H.number_of_edges()
Out[6]: 6160
Because of that the internal structure of the graph object storage for an edge is G[node][node][key][attribute]=value (note the extra key dictionary level for multigraphs).
You are explicitly modifying the structure by
for e,v in BasicGraph.edges_iter():
BasicGraph[e][v]['test'] = 'test'
which breaks it.
It is allowed to modify the data structure that way but it is safer to use the NetworkX API
In [7]: G = nx.MultiGraph()
In [8]: G.add_edge(1,2,key='one')
In [9]: G.add_edge(1,2,key='two')
In [10]: G.edges(keys=True)
Out[10]: [(1, 2, 'two'), (1, 2, 'one')]
In [11]: G.add_edge(1,2,key='one',color='red')
In [12]: G.add_edge(1,2,key='two',color='blue')
In [13]: G.edges(keys=True,data=True)
Out[13]: [(1, 2, 'two', {'color': 'blue'}), (1, 2, 'one', {'color': 'red'})]