本帖最后由 心弦上的景致 于 2015-8-25 18:31 编辑
所有的软件,大体可肢解为两部分:样式和数据。样式:交互入口。数据:业务(排除指令数据)。数据有区分为业务数据和逻辑数据。数据流通,依赖协议;数据容 储,又分为记忆和非记忆,主要依赖数据库和其他数据容储办法。项目出问题,90%的问题都是数据导致的。所以,我认为,大部分测试手段,都是基于对数据的 检验而衍生出来的解决办法。在数据操作过程中,我总结了这样几个行为:生产,消费,建模,交互,分流,包装。如何保证数据不发生偏误和丢失,如何提高解决 问题的效率,这就成了一个有意思的话题。在以往的项目实施过程中吗,我养成了这样一个方式。第一,注释保持有效代码量的1/3;第二,所有基于数据,进行日志输出。
涉及到项目里面所有的业务数据和逻辑数据,全部进行输出。在这方面,不必担心数据泄漏问题,也不需要通过逻辑数据控制日志输出。
如何控制日志是否输出。通过BuildConfi.java里面boolean字段进行控制。该文件与R文件在同一个目录下。debug签名情况下,状态为true,签名之
后,自动切换为了false,通过它控制日志输出,不做认为设置,避免疏漏导致数据泄漏。
如下是自定义log的具体代码,一共分两个文件:
- public class Logger {
- public Logger() { }
- public void v(String format, Object... args) { }
- public void d(String format, Object... args) { }
- public void i(String format, Object... args) { }
- public void w(String format, Object... args) { }
- public void w(Throwable tr, String format, Object... args) { }
- public void e(String format, Object... args) { }
- public void e(Throwable tr, String format, Object... args) { }
- public void wtf(String format, Object... args) { }
- public void wtf(Throwable tr, String format, Object... args) { }
- }
- public class LogManager {
-
- public static final String Default_Tag = "LOGTEST";
-
- private static Logger Logger;
-
- private static HashMap<String,Logger> LoggerMap = null;
-
- public static Logger getLogger() {
- return getLogger(null);
- }
-
- public static Logger getLogger(String tag) {
- if(BuildConfig.DEBUG) {
- return getDebugLogger(tag);
- } else {
- if (Logger == null) {
- Logger = new Logger();
- }
- return Logger;
- }
- }
-
- private static Logger getDebugLogger(String tag) {
- if(null == tag) tag = Default_Tag;
-
- Logger logger;
- if(null == LoggerMap) {
- synchronized (LogManager.class) {
- if(null == LoggerMap) LoggerMap = new HashMap<String,Logger>();
- }
- }
- if (LoggerMap.containsKey(tag))
- logger = LoggerMap.get(tag);
- else {
- logger = new DebugLogger(tag);
- LoggerMap.put(tag, logger);
- }
- return logger;
- }
- private static class DebugLogger extends Logger {
- private String tag;
-
- private DebugLogger(String tag) {
- if(null != this.tag && tag == this.tag) return;
- this.tag = null == tag? LogManager.Default_Tag:tag;
- }
-
- @Override
- public void v(String format, Object... args) {
- Log.v(tag, buildSimpleMessage(format, args));
- }
- @Override
- public void d(String format, Object... args) {
- Log.d(tag, buildSimpleMessage(format, args));
- }
-
- @Override
- public void i(String format, Object... args) {
- Log.i(tag, buildSimpleMessage(format, args));
- }
-
- @Override
- public void w(String format, Object... args) {
- Log.w(tag, buildMessage(format, args));
- }
-
- @Override
- public void w(Throwable tr, String format, Object... args) {
- Log.w(tag, buildMessage(format, args), tr);
- }
- @Override
- public void e(String format, Object... args) {
- Log.e(tag, buildMessage(format, args));
- }
- @Override
- public void e(Throwable tr, String format, Object... args) {
- Log.e(tag, buildMessage(format, args), tr);
- }
- @Override
- public void wtf(String format, Object... args) {
- Log.wtf(tag, buildMessage(format, args));
- }
- @Override
- public void wtf(Throwable tr, String format, Object... args) {
- Log.wtf(tag, buildMessage(format, args), tr);
- }
- private String buildSimpleMessage(String format, Object... args) {
- return (args == null) ? format : String.format(Locale.US, format, args);
- }
- private String buildMessage(String format, Object... args) {
- String msg = buildSimpleMessage(format, args);
- StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();
- String caller = "<unknown>";
- for (int i = 2; i < trace.length; i++) {
- Class<?> clazz = trace[i].getClass();
- if (!clazz.equals(DebugLogger.class)) {
- String callingClass = trace[i].getClassName();
- callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
- callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
- caller = callingClass + "." + trace[i].getMethodName();
- break;
- }
- }
- return String.format(Locale.US, "[%d] %s: %s",
- Thread.currentThread().getId(), caller, msg);
- }
- }
- }
复制代码 使用方式:LogManager.getLogger().d("keyvalues: %s, keyvalues: %s",values, values);
%s 设置以字符串格式输出,keyvalues自定数据串标识,values表示和keyvalues对应的实体数据
这个Log工具,能够定位输出数据所在的文件名字和方法名字。通过LogManager的Default_Tag设置Tag信息,通过自定义过滤器进行针对性过滤,这样呈现的就是你当前交互过程中,所有生产和消费数据的情况。大部分问题,通过观察数据输出,直接能够定位到数据断层,找到问题根源,个别情况需要通过debug进行辅助。
|
|