以前使用 Asp.NET + MySQL 搭建系统平台,使用了 MySQL 网上 Connector 5.22 版,发现其中的 Membership 的实现上存在 Bug,有时会抛出异常,引起网站服务停止,原因不明。
重新登录 MySQL官方网站,发现 Connector 已经升级到 6.22 ,于是下载,升级系统,希望能够修复以上的 Bug。
结果大失所望,6.22 版竟然抛出了另一种异常,原来运行得挺好的系统,跑也跑不起来了。
用户代码未处理 System.FormatException
Message="GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。"
Source="mscorlib"
StackTrace:
在 System.Guid..ctor(String g)
在 MySql.Data.Types.MySqlGuid.MySql.Data.Types.IMySqlValue.ReadValue(MySqlPacket packet, Int64 length, Boolean nullVal)
在 MySql.Data.MySqlClient.NativeDriver.ReadColumnValue(Int32 index, MySqlField field, IMySqlValue valObject)
在 MySql.Data.MySqlClient.ResultSet.get_Item(Int32 index)
在 MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue(Int32 index, Boolean checkNull)
在 MySql.Data.MySqlClient.MySqlDataReader.GetValue(Int32 i)
在 MySql.Data.MySqlClient.MySqlDataReader.GetValues(Object[] values)
在 System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
在 System.Data.ProviderBase.SchemaMapping.LoadDataRow()
在 System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
在 System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
在 System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
……
google 一下,有以下线索:
不管怎样,6.22 暂时不能用了,又将系统恢复为旧版,一个来回,几十个模块,2个小时不见了。
教训是:
1、要为每个模块创建完善、独立的单元测试集,升级组件时,能够进行完整测试,也能很快找到问题。(创建完整的测试集合,非常费劲,但是很有价值,越到后期,价值越大)
2、单元测试如果涉及到数据库,最好指定独立的connectString,建立另一个数据库,以免影响已有数据。
3、单元测试最好是自己创建的全脚本,全自动化的,保证任何情况下测试集合都能运行才有用。
这方面,.NET软件测试自动化之道 有很好的范例,如果没有这本书,从网上可以下载到它的代码,对于创建自己独立的自动化测试集很有用。