qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          API自動化測試總結

          說實話,第一次接觸這類測試,剛開始有些摸不到頭腦,確切的說是摸不到重點,無論是測試還是TC,都讓我很頭疼,后來慢慢的,我就領悟到了這類測試的方法以及技巧,后來覺得真的很簡單,并不像當初想的那么不容易。
            首先明確哪些是需要測試的API
            研發的代碼中可能實現了很多API,首先必須明確哪些需要測,哪些不必要測;哪些整個迭代不測,下一個迭代再測;有一些接口是可能就直接調用另外一個接口,這些接口有沒有必要測等。這些沒有確定清楚直接導致漏測或者做無用功。
            明確每個API實現的功能和設計TC
            在確定了哪些接口需要測試之后,就必須明確每個接口實現的功能以及接口的參數、返回值的意義等。理解這些接口參數的含義,這些參數僵尸設計TC的維度,簡單的說,這些參數可以看成一個一個輸入框,李四網頁手工測試一樣,將準備數據輸入即可。用黑盒的方法來為API設計TC和網頁手工測試很類似,無非就是把參數看成輸入框而已。但是API測試在設計TC的時候還可以'偏白'一點,就是直接去看接口的實現的代碼,特別是一些異常情況的處理,一般程序在異常處理上總是相對于正常情況要脆弱一些,然后對前面用黑盒的方法設計好的TC進行一些補充。
            值得注意的是,1)TC設計的時候盡量詳細,粒度盡量的小,測試代碼都是類似的,可能僅僅是傳入的參數不一樣,而測試校驗的工作是計算機做的,所以一般情況下針對某個接口,10個TC和20個TC跑的花費是差不多的,但是測試粒度方面和代碼覆蓋率方面可能就增加了不少。2)TC也是要進行維護的,在測試執行階段,如果發現需要補充TC,最好不要在現有的測試代碼上改,要新加代碼,同時在TC文檔中也同步更新。如果是TC的缺陷,才去修改對應的代碼,并在TC文檔中做更新。3)在設計TC文檔的時候,測試步驟的粒度最好能夠細到每一步需要調用哪個函數或接口,有點類似偽代碼的風格,這樣在寫代碼的時候就不用怎么思考,僅僅去實現它。
            我們做這類測試,是直接拿應用程序在本地開啟service,首先你在啟動service之前,要配置好web.config文件,這個很重要,包括你測試所需要的數據庫名字以及相應API測試所需要的特殊配置。我們這里主要配置和外部有交互的一些service地址,以及一些數字電視產品的ID等信息。
            API測試除了要測試功能以外還要測試接口。一個API或者函數可以作為一個單元,對這個單元進行單元測試,可以用黑盒也可以用白盒方法。黑盒方法就是不去看這個單元的實現代碼,只根據中廣核單元的功能說明來設計測試用例并進行測試。測試的時候可能需要寫一些簡單的代碼來做數據準備,然胡去調用需要測試的接口,一般也需要寫一些代碼來接受或者驗證被測單元的輸出是否正確;白盒測試方法就是同構分心被測單元的實現代碼,根據不同的測試策略來設計測試用例并作相應的測試。平臺產品的需求很多事來自網站,簡而言之,平臺產品提供API給網站研發使用。我們需要測的就是那些暴漏出來的API,確保這些API在功能上沒有缺陷。
            我在做API測試的時候,主要采用的是黑盒測試方法,用Fiddler工具去調接口,這個方便又明了,很容易看出被測單元的輸出是否正確。不過事先你需要明確的了解需求,以及整個系統的架構,需要了解都和哪些service有交互,都做哪些交互等。

          posted @ 2014-09-04 09:41 順其自然EVO 閱讀(259) | 評論 (0)編輯 收藏

          Selenium-三種啟動chrome的方式

           當啟動chrome作selenium測試時,如果沒有設置driver,則會出錯.
            driver下載地址https://code.google.com/p/chromedriver/downloads/list
            三種方式
            1.命令行中帶參數-Dwebdriver.chrome.driver
            java -Dwebdriver.chrome.driver=chromedriver_win_22_0_1203_0b.exe  org.junit.runner.JUnitCore seleniumtest_name
            2.命令行中可以沒有-Dwebdriver.chrome.driver,但是需要在環境變量path中添加
            chromedriver.exe(注意此處文件名只能是chromedriver.exe)的路徑.
            例如chromedriver.exe的放在d:/中,  則把"d:/"添加到path變量中
            此時命令簡化為:
            java  org.junit.runner.JUnitCore  seleniumtest_name
            3.可以在.java源文件中顯示設置chromedriver
            System.setProperty("webdriver.chrome.driver","d:/chromedriver_win_22_0_1203_0b.exe")

          posted @ 2014-09-04 09:41 順其自然EVO 閱讀(201) | 評論 (0)編輯 收藏

          RabbitMQ遠程調用測試用例

           RabbitMQ遠程調用測試,使用外部機器192.168.174.132上的RabbitMQ,使用之前需要對遠程調用進行配置,操作過程見博文“解決RabbitMQ遠程不能訪問的問題”。
            SendTest:
          package com.mq.rabbitmq.rabbitmqtest;
          import java.util.Date;
          import com.rabbitmq.client.ConnectionFactory;
          import com.rabbitmq.client.Connection;
          import com.rabbitmq.client.Channel;
          import com.rabbitmq.client.QueueingConsumer;
          public class ReceiveTest {
          private final static String QUEUE_NAME = "ftpAgent";
          private final static String userName = "admin";
          private final static String password = "admin";
          private final static String virtualHost = "/";
          private final static int portNumber = 5672;
          private final static String hostName = "master";
          private final static String host = "192.168.174.132";
          public static void main(String[] argv) throws java.io.IOException,
          java.lang.InterruptedException {
          ConnectionFactory factory = new ConnectionFactory();
          //      factory.setHost("192.168.174.160");
          factory.setUsername(userName);
          factory.setPassword(password);
          //      factory.setVirtualHost(virtualHost);
          factory.setHost(host);
          factory.setPort(portNumber);
          Connection connection = factory.newConnection();
          Channel channel = connection.createChannel();
          //      channel.queueDeclare(QUEUE_NAME, false, false, false, null);
          System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
          QueueingConsumer consumer = new QueueingConsumer(channel);
          channel.basicConsume(QUEUE_NAME, true, consumer);
          Date nowTime = new Date();
          while (true) {
          QueueingConsumer.Delivery delivery = consumer.nextDelivery();
          String message = new String(delivery.getBody());
          System.out.println("RecieveTime: " + nowTime);
          System.out.println(" [x] Received '" + message + "'");
          }
          }
          }
           ReceiveTest:
          package com.mq.rabbitmq.rabbitmqtest;
          import java.util.Date;
          import com.rabbitmq.client.ConnectionFactory;
          import com.rabbitmq.client.Connection;
          import com.rabbitmq.client.Channel;
          import com.rabbitmq.client.QueueingConsumer;
          public class ReceiveTest {
          private final static String QUEUE_NAME = "ftpAgent";
          private final static String userName = "admin";
          private final static String password = "admin";
          private final static String virtualHost = "/";
          private final static int portNumber = 5672;
          private final static String hostName = "master";
          private final static String host = "192.168.174.132";
          public static void main(String[] argv) throws java.io.IOException,
          java.lang.InterruptedException {
          ConnectionFactory factory = new ConnectionFactory();
          //      factory.setHost("192.168.174.160");
          factory.setUsername(userName);
          factory.setPassword(password);
          //      factory.setVirtualHost(virtualHost);
          factory.setHost(host);
          factory.setPort(portNumber);
          Connection connection = factory.newConnection();
          Channel channel = connection.createChannel();
          //      channel.queueDeclare(QUEUE_NAME, false, false, false, null);
          System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
          QueueingConsumer consumer = new QueueingConsumer(channel);
          channel.basicConsume(QUEUE_NAME, true, consumer);
          Date nowTime = new Date();
          while (true) {
          QueueingConsumer.Delivery delivery = consumer.nextDelivery();
          String message = new String(delivery.getBody());
          System.out.println("RecieveTime: " + nowTime);
          System.out.println(" [x] Received '" + message + "'");
          }
          }
          }
            運行結果:
            SendTest:

          posted @ 2014-09-04 09:40 順其自然EVO 閱讀(669) | 評論 (0)編輯 收藏

          云主機磁盤性能測試

           磁盤IO是云主機的重要指標,可以按照負載情況分成照順序讀寫,隨機讀寫兩大類。
            fio 是測試磁盤性能的最佳工具:
            1、測試順序讀性能
            fio --filename=/home/test -iodepth=64-ioengine=libaio--direct=1--rw=read--bs=1m--size=2g--numjobs=4--runtime=10 --group_reporting --name=test-read
            2、測試順序寫性能
            fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=write-bs=1m-size=2g-numjobs=4-runtime=20 -group_reporting -name=test-write
            3、測試隨機讀性能
            fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=randread-bs=4k-size=2G-numjobs=64-runtime=20 -group_reporting -name=test-rand-read
            4、測試隨機寫性能
            fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=randwrite-bs=4k-size=2G-numjobs=64-runtime=20 -group_reporting -name=test-rand-write
            參數說明:
            filename=/home/test 測試文件名稱,通常選擇需要測試的盤的data目錄。
            direct=1 測試過程繞過機器自帶的buffer。使測試結果更真實。
            rw=randwrite 測試隨機寫的I/O
            rw=randrw 測試隨機寫和讀的I/O
            bs=4k 單次io的塊文件大小為4k
            size=2g 本次的測試文件大小為2g,以每次4k的io進行測試。
            numjobs=64 本次的測試線程為64.
            runtime=20 測試時間為20秒,如果不寫則一直將2g文件分4k每次寫完為止。
            報告如何查看:
            fio的結果報告內容豐富,我們主要關心的是兩項:
            磁盤的吞吐量bw,這個是順序讀寫考察的重點
            磁盤的每秒讀寫次數iops,這個是隨機讀寫考察的重點
            比如,下面是4個測試的結果部分截取:
            test-read: (groupid=0, jobs=4): err= 0: pid=4752
            read : io=839680KB, bw=76823KB/s, iops=75 , runt= 10930msec
            順序讀,帶寬76823KB/s,iops 75
            test-write: (groupid=0, jobs=4): err= 0: pid=4758
            write: io=899072KB, bw=42854KB/s, iops=41 , runt= 20980msec
            順序寫,帶寬42854KB/s, iops=41
            test-rand-read: (groupid=0, jobs=64): err= 0: pid=4619
            read : io=72556KB, bw=3457.4KB/s, iops=864 , runt= 20986msec
            隨機讀,帶寬3457.4KB/s, iops=864
            test-rand-write: (groupid=0, jobs=64): err= 0: pid=4685
            write: io=129264KB, bw=6432.4KB/s, iops=1608 , runt= 20097msec
            隨機寫,帶寬6432.4KB/s, iops=1608。

          posted @ 2014-09-04 09:40 順其自然EVO 閱讀(230) | 評論 (0)編輯 收藏

          使用shell測試歷史數據樣本

            使用shell分析了一些數據有一些時間了,而且分析的數據情況也是基于歷史數據,今天寫了個腳本對歷史的數據進行一個簡單的分析,看看準確率到底有多高。
            這里有一個借助一個腳本12c.sh 對一些數據的排列百分比進行分析,比如今天有兩個球隊,主隊讓球一個,勝平負的概率為35%,40%,25%
            表data里存放著一些樣本數據,記錄了球隊的比賽情況。
          sqlplus -s n1/n1 <<EOF
          set linesize 150
          set pages 0
          set feedback off
          spool check_$1.sh
          select 'ksh 12c.sh'||w||' '||t||' '||l||' '||rw||' '||rt||' '||rl||' ' from data where r=-1 and startdate='$1';
          spool off;
          EOF
          ksh check_$1.sh |tee check_$1.log
          grep suggest check_$1.log  |awk '{print $7" "$8" "$9" "$10" "$11" "$12" "$1" "$2" "$3" "$4" "$5" "$6}'>>filter_check.log
          cat filter_check.log
          function get_result
          {
          echo $1
          sqlplus -s n1/n1 <<EOF
          set pages 0
          select case when zhu>ke+1
          then rpad('big win:',20)||to_number(w+rw)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7'
          when zhu=ke+1
          then rpad('little win:',20)||to_number(w+rt)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7'
          when zhu=ke
          then rpad('tie:',20)||to_number(t+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7'
          when zhu=ke-1
          then rpad('little lose:',20)||to_number(l+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7'
          when zhu<ke-1
          then rpad('big lose:',20)||to_number(l+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7'
          end
          end from data where  startdate='$1'  and w=$2 and t=$3 and l=$4 and rw=$5 and rt=$6 and rl=$7 order by (zhu-ke);
          EOF
          }
          while read line
          do
          echo ---start
          echo $line
          input_params=`echo $line|awk '{print $1" "$2" "$3" "$4" "$5" "$6}'`
          get_result $1 $input_params
          echo ....end
          echo .
          done <filter_check.log
          rm check_$1.log
          rm filter_check.log
          rm check_$1.sh
            分析結果如下,比如對前幾天的比賽情況進行分析,在我不知道比賽結果的前提下。
            5場比賽猜中了3場,僅供娛樂。
          ---start
          1.24 5.35 7.6 1.8 3.75 3.28 suggest w :82% of total 11
          2014-08-26
          little win:         4.99 1.24,5.35,7.6,1.8,3.75,3.28
          ....end
          .
          ---start
          1.18 5.85 9.4 1.65 3.9 3.75 suggest w :71% of total 17
          2014-08-26
          tie:                9.6 1.18,5.85,9.4,1.65,3.9,3.75
          ....end
          .
          ---start
          1.43 4.15 5.42 2.42 3.4 2.38 suggest w :65% of total 97
          2014-08-26
          little lose:        7.8 1.43,4.15,5.42,2.42,3.4,2.38
          ....end
          .
          ---start
          2.1 2.95 3.25 4.7 3.6 1.57 suggest rl :68% of total 50
          2014-08-26
          tie:                4.52 2.1,2.95,3.25,4.7,3.6,1.57
          ....end
          .
          ---start
          1.1 6.75 15 1.45 4.2 4.95 suggest w :80% of total 5
          2014-08-26
          big win:            2.55 1.1,6.75,15,1.45,4.2,4.95
          ....end

          posted @ 2014-09-03 11:55 順其自然EVO 閱讀(156) | 評論 (0)編輯 收藏

          JAVA JDK和Tomcat環境變量配置

          CLASSPATH是什么?它的作用是什么?
            它是javac編譯器的一個環境變量。它的作用與import、package關鍵字有關。當你寫下improt java.util.*時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的類;但是編譯器如何知道你把這個 package放在哪里了呢?所以你首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設置CLASSPATH啦 :) 如果java.util這個package在c:/jdk/ 目錄下,你得把c:/jdk/這個路徑設置到CLASSPATH中去!當編譯器面對import java.util.*這個語句時,它先會查找CLASSPATH所指定的目錄,并檢視子目錄java/util是否存在,然后找出名稱吻合的已編譯文件 (.class文件)。如果沒有找到就會報錯!CLASSPATH有點像c/c++編譯器中的INCLUDE路徑的設置哦,是不是?當c/c++編譯器遇 到include 這樣的語句,它是如何運作的?哦,其實道理都差不多!搜索INCLUDE路徑,檢視文件!當你自己開發一個package時,然后想要用這個 package中的類;自然,你也得把這個package所在的目錄設置到CLASSPATH中去!CLASSPATH的設定,對JAVA的初學者而言是 一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發現,在你安裝之后,即使完全沒有設定CLASSPATH,你仍然能夠編譯基本的JAVA 程序,并且加以執行。  .....................................................................................................................................................
            1. PATH環境變量。作用是指定命令搜索路徑, 在命令行下面執行命令如javac編譯java程序時,它會到PATH變量所指定的路徑中查找看是否能找到相應的命令程序。我們需要把jdk安裝目錄下的 bin目錄增加到現有的PATH變量中,bin目錄中包含經常要用到的可執行文件如javac/java/javadoc等待,設置好PATH變量后,就 可以在任何目錄下執行javac/java等工具了。我們這里設定的PATH值為:
            %SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%SYSTEMROOT%/System32/WindowsPowerShell/v1.0/;C:/Program Files/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;C:/Program Files/Common Files/TTKN/Bin;C:/Program Files/Common Files/Teleca Shared;C:/Program Files/Java/jdk1.6.0_21/bin
            上述只有紅色部分;C:/Program Files/Java/jdk1.6.0_21/bin是java的PATH變量,注意變量之間需要用";”隔開。
            2. CLASSPATH環境變量。作用是指定類搜索路徑, 要使用已經編寫好的類,前提當然是能夠找到它們了,JVM就是通過CLASSPATH來尋找類的。我們需要把jdk安裝目錄下的lib子目錄中的 dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中。這里CLASSPATH為:
            .;C:/Program Files/Java/jdk1.6.0_21/lib/dt.jar;C:/Program Files/Java/jdk1.6.0_21/lib/tools.jar
            3. JAVA_HOME環境變量。它指向jdk的安裝目錄,Eclipse/NetBeans/Tomcat等軟件就是通過搜索JAVA_HOME變量來找到并使用安裝好的jdk。這里JAVA_HOME為:
            C:/Program Files/Java/jdk1.6.0_21
           .....................................................................................................................................................
            java環境變量配置步驟:
            在windows桌面上右擊“我的電腦” —> “屬性” —> “高級” —> “環境變量”,在“系統變量”里我們可以看到系統的各個環境變量的值。雙擊某個變量名可以修改變量值,變量值之間用“;”隔開。我們還可以“新建”原先沒 有的變量。與jdk有關的有3個環境變量;“JAVA_HOME”,“PATH”,“CLASSPATH”。我的系統中“PATH”變量已經存在,可以直 接添加新值(其它變量值不要動,防止其它程序運行異常),其它兩個變量需要新建。
            CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
            JAVA_HOME = C:/Program Files/Java/jdk1.5.0
            PATH  = %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin
            從上面我們可以看出,PATH和CLASSPATH都使用到了JAVA_HOME,也可以使用絕對路徑,兩者皆可。
           Tomcat環境變量配置:
            系統變量中新建
            BASEDIR,路徑為:Tomcat根目錄,如D:\Tomcat
            其它與java jdk相關的引用路徑可以查看文件bin\setclasspath.bat
            注意,java環境變量配置JAVA_HOME主要為了其它容器調用,JAVA_HOME的java jdk路徑后邊不帶“;”  即不可分號結束。
           .....................................................................................................................................................
          Tomcat\bin中setclasspath.bat文件
          rem ---------------------------------------------------------------------------
          rem Set CLASSPATH and Java options
          rem
          rem $Id: setclasspath.bat,v 1.6.2.1 2004/08/21 15:49:50 yoavs Exp $
          rem ---------------------------------------------------------------------------
          rem Make sure prerequisite environment variables are set
          if not "%JAVA_HOME%" == "" goto gotJavaHome
          echo The JAVA_HOME environment variable is not defined
          echo This environment variable is needed to run this program
          goto exit
          :gotJavaHome
          if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
          if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome
          if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
          if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
          goto okJavaHome
          :noJavaHome
          echo The JAVA_HOME environment variable is not defined correctly
          echo This environment variable is needed to run this program
          echo NB: JAVA_HOME should point to a JDK not a JRE
          goto exit
          :okJavaHome
          if not "%BASEDIR%" == "" goto gotBasedir
          echo The BASEDIR environment variable is not defined
          echo This environment variable is needed to run this program
          goto exit
          :gotBasedir
          if exist "%BASEDIR%\bin\setclasspath.bat" goto okBasedir
          echo The BASEDIR environment variable is not defined correctly
          echo This environment variable is needed to run this program
          goto exit
          :okBasedir
          rem Set the default -Djava.endorsed.dirs argument
          set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed
          rem Set standard CLASSPATH
          rem Note that there are no quotes as we do not want to introduce random
          rem quotes into the CLASSPATH
          set CLASSPATH=%JAVA_HOME%\lib\tools.jar
          rem Set standard command for invoking Java.
          rem Note that NT requires a window name argument when using start.
          rem Also note the quoting as JAVA_HOME may contain spaces.
          set _RUNJAVA="%JAVA_HOME%\bin\java"
          set _RUNJAVAW="%JAVA_HOME%\bin\javaw"
          set _RUNJDB="%JAVA_HOME%\bin\jdb"
          set _RUNJAVAC="%JAVA_HOME%\bin\javac"
          goto end
          :exit
          exit /b 1
          :end

          posted @ 2014-09-03 11:54 順其自然EVO 閱讀(341) | 評論 (0)編輯 收藏

          深入理解mysql參數

          前言:mysql參數的修改在mysql的課程里面應該屬于相對基礎的知識,但是作為一個mysql的初學者還是很有必要弄懂這個知識點,以后的學習過程中將會經常用到的。技術很多時候都是相通的,如果有學過oracle的朋友應該會知道,oracle的參數里面有幾個標簽:動態參數、靜態參數、session級別修改、全局修改、立即生效和延遲生效。作為數據庫mysql也同樣有這些特性,但是整體學起來后會發現mysql某些方面還是沒有oracle做的到位,在該文檔的最后咱們再做個總結。
            一、參數文件
            1、查看參數文件
            通過命令行"mysql --help | grep my.cnf"查看my.cnf文件的位置,linux操作系統中參數文件默認為/etc/my.cnf,按照mysql官方文檔的說明,mysql的啟動參數文件的順序如下:
            1、查找根據順序查找全局 /etc/my.cnf  /etc/mysql/my.cnf  /SYSCONFDIR/my.cnf為全局選項
            2、$MYSQL_HOME/my.cnf為服務指定變量
            二、參數文件的修改
            1、動態參數和靜態參數的概念
            Mysql 的參數類型:分為動態(dynamic)和靜態參數(static);
            動態參數意味著可以再mysql實例運行中進行更改;
            靜態參數說明在整個實例聲明周期內都不得進行更改,就好像是只讀的。
            在動態參數中,有些參數修改可以是基于回話的也可以是基于整個實例的生命周期。
            2、全局變量與會話變量
            全局變量在MYSQL啟動的時候由服務器自動將它們初始化為默認值。會話變量在每次建立一個新的連接的時候,由MYSQL來初始化。MYSQL會將當前所有全局變量的值復制一份。來做為會話變量。(也就是說,如果在建立會話以后,沒有手動更改過會話變量與全局變量的值,那所有這些變量的值都是一樣的。全局變量與會話變量的區別就在于,對全局變量的修改會影響到整個服務器,但是對會話變量的修改,只會影響到當前的會話(也就是當前的數據庫連接)
            3、參數的查看方式
            Mysql的參數可以通過"show variables"來查看,由于從mysql5.1版本開始,可以通過information_schema架構下的GLOBAL_VARIABLES視圖來進行查找,所以也可以這樣查看"select * from information_schema.global_variables";
            查看參數的腳本:
            語句一、
            mysql> SHOW VARIABLES LIKE 'max_join_size';
            mysql> SHOW GLOBAL VARIABLES LIKE 'max_join_size';
            語句二、
          mysql> select * from information_schema.global_variables;
          +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+
          | VARIABLE_NAME                                     | VARIABLE_VALUE                                                                                                         |
          +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+
          | MAX_PREPARED_STMT_COUNT                           | 16382                                                                                                                  |
          | INNODB_BUFFER_POOL_SIZE                           | 134217728                                                                                                              |
          | HAVE_CRYPT                                        | YES                                                                                                                    |
          | PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE | 10000                                                                                                                  |
          | INNODB_VERSION                                    | 5.5.36                                                                                                                 |
          | QUERY_PREALLOC_SIZE                               | 8192                                                                                                                   |
          | DELAYED_QUEUE_SIZE                                | 1000                                                                                                                   |
          | PERFORMANCE_SCHEMA_MAX_COND_INSTANCES             | 1000                                                                                                                   |
          | SSL_CIPHER                                        |                                                                                                                        |
          | COLLATION_SERVER                                  | utf8_general_ci                                                                                                        |
          | SECURE_FILE_PRIV                                  |                                                                                                                        |
          | TIMED_MUTEXES                                     | OFF                                                                                                                    |
          | DELAYED_INSERT_TIMEOUT                            | 300                                                                                                                    |
          | PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES            | 1000000                                                                                                                |
          | LC_TIME_NAMES                                     | en_US
           4、參數的修改,參數的修改有以下幾種方法,作為學習、便于理解其中的原理所在,這里把幾種方法都整理出來了,歡迎各位的查看
            方法一、修改參數文件。所有的參數都保存在/etc/my.cnf文件中,所以直接修改該參數文件便可修改相應的系統參數。
            弊端:修改該參數需要重啟后才能生效,當系統上線后一般都不能隨便重啟,所以該方法很少用;
            操作方法:
            1、修改參數文件/etc/my.cnf,添加general_log_file = /data/mysql/mysql_2.logvi  /etc/my.cnf
          # The MySQL server
          [mysqld]
          port            = 3306
          socket          = /tmp/mysql.sock
          skip-external-locking
          key_buffer_size = 384M
          max_allowed_packet = 1M
          table_open_cache = 512
          sort_buffer_size = 2M
          read_buffer_size = 2M
          read_rnd_buffer_size = 8M
          myisam_sort_buffer_size = 64M
          thread_cache_size = 8
          query_cache_size = 32M
          # Try number of CPU's*2 for thread_concurrency
          thread_concurrency = 8
          general_log_file = /data/mysql/mysql_2.log
            2、重啟mysql服務
            service mysqld stop
            3、檢查參數是否生效
            mysql> show variables like 'general%';
            +------------------+-------------------------+
            | Variable_name    | Value                   |
            +------------------+-------------------------+
            | general_log      | OFF                     |
            | general_log_file | /data/mysql/mysql_2.log |
            +------------------+-------------------------+
            2 rows in set (0.00 sec)
            當前顯示已生效
            方法二、如果是動態參數的話,便可以直接通過語句修改。
            (http://dev.mysql.com/doc/refman/5.6/en/dynamic-system-variables.html mysql的所有參數詳情介紹
            sql語法:
            SET variable_assignment [, variable_assignment] ...      //可以同時修改多個參數
            variable_assignment:
            user_var_name = expr
            | [GLOBAL | SESSION] system_var_name = expr
            | @@[global. | session.]system_var_name = expr
            例子:
            SET sort_buffer_size=10000;   /修改SESSION參數
            SET @@local.sort_buffer_size=10000;   /修改全局參數
            SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;   /同時修改多個SESSION參數
            SET @@sort_buffer_size=1000000; /第二種修改全局參數的方法
            SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
            說明如下:
            1)修改SESSION的參數的影響:如果您使用SESSION(默認情況)設置一個系統變量,則該值仍然有效,直到當前會話結束為止,或者直到您把變量設置為一個不同的值為止。
            2)如果您使用GLOBAL(要求SUPER權限)來設置一個系統變量,則該值被記住,并被用于新的連接,直到服務器重新啟動為止。
            如果您想要進行永久式變量設置,需要寫入到參數文件。(通過SET命令并不會修改參數文件的內容,還需要另行修改,這點做的沒有ORACLE好)
            3)為了防止不正確的使用,如果您使用SET GLOBAL時同時使用了一個只能與SET SESSION同時使用的變量,或者如果您在設置一個全局變量時未指定GLOBAL(或@@),則MySQL會產生一個錯誤。( SET GLOBAL命令修改SESSION參數的時候會報錯)
            4)如果您想要把一個SESSION變量設置為GLOBAL值或把一個GLOBAL值設置為內部MySQL默認值,需使用DEFAULT關鍵詞。例如,在把max_join_size會話值設置為全局值時,以下兩個語句是一樣的:SET max_join_size=DEFAULT;(恢復成默認值的設置)
            總結:1、mysql的參數設置相對oracle來說較為簡單。
            2、針對參數設置的方法本身沒有太多經驗,作為一個DBA不管是修改oracle參數、或mysql參數,建議每個數據庫都有一個文檔用于記錄參數修改的歷史,這樣哪臺出現了問題,便于跟蹤;

          posted @ 2014-09-03 11:54 順其自然EVO 閱讀(307) | 評論 (0)編輯 收藏

          高效組織的配置管理計劃

          根據IEEE 828和CMM/CMMI,配置管理計劃常常被認為是一份文檔,確實的,對于一個大項目而言,往往需要制定項目自身的配置管理計劃。
            但不是所有的組織都是軟件外包組織,不是每個項目針對的是不同的客戶。
            在非軟件外包的高效軟件開發組織中,推薦的配置管理計劃應有三個層面。
            首先是組織層面,一般,提供統一的配置管理服務,不會允許每個團隊自己搭建配置管理服務器。所以對于組織級的配置管理服務要有所約定,約定的主要內容有:
            如何建立項目文檔目錄?
            如何建立產品級目錄?
            如何建立代碼目錄?
            配置項如何命名?
            配置庫的備份和恢復如何進行?誰來進行?
            什么情況下拉分支?什么情況下合并到主干? 關于分支主干要提供多種模式,或者放開限制,讓產品線或者項目組選擇。
            如何進行變更? 一般應當在組織級進行定義和發布。如果放到項目層面,變更流程的制定太費功夫;當然有些大項目是有足夠的預算和特殊情況需要專門定義項目級的變更。
            對產品線和項目如何開展配置審計?
            有什么推薦的配置管理實踐?
            組織級配置管理規程或者指南的更新頻率在每年一次左右。
            其次是產品線層面。對于特定產品線,已經存在大量的源代碼和文檔,那么結合實際,這個產品線在配置管理存儲時有哪些約定?
            比如對代碼配置項和非配置項有所說明,不要假設每個團隊新人都是代碼配置管理達人,小心自以為是的新手加入一些自以為是的垃圾。雖然可以刪除,但發現再刪除,其本身就是成本。
            比如哪些依賴項值得存儲?
            比如哪些區域是機密,權限另外管理
            比如那些代碼是核心代碼,如果改動需要資深人員復核。
            本產品線的主干和分支策略是什么? 守護主干?還是先鋒主干?無分支?還是單分支?還是多分支?
            比如約定團隊統一一致的工作環境:都把Java裝在C:/java,把eclipse裝在D:/eclipse
            最后是項目層面。在有了上述組織級和產品線級的配置管理約定后,項目層面的配置管理計劃中最關鍵的是需要明確人員、基線和項目特殊配置項。其中基線的安排必須與項目本身生命周期的選擇相匹配,最重要而言,必須匹配于里程碑。
            在這樣的三層結構下,為項目高效計,不需要單獨寫項目的配置管理計劃,只需把項目級的配置管理約定寫入項目計劃即可,一般的篇幅不超過1頁。

          posted @ 2014-09-03 11:53 順其自然EVO 閱讀(200) | 評論 (0)編輯 收藏

          如何控制項目的范圍變更

           項目所處的階段越早,項目不確定性就越大,項目調整或變更的可能性就越大,同時帶來的代價比較低。但隨著項目的進行,不確定性逐漸減小,而變更的代價、付出的人力、資源逐漸增加,就會增加決策的困難度。
            一旦項目變更發生了,項目經理該怎么處理呢?
            1.記錄變更請求(CR): 任何變更,不論以后是否會被接受,都應該首先記錄下來,有些變更請求也許在本階段不被接受,也許可以成為以后參考的功能或范圍。所以對于任何變更請求,首先要做的是記錄下來是一個什么樣的變更請求,是由哪一類項目干系人提出來的,以及相應的聯系方式。
            2.澄清變更細節,分析相應變更請求的必要性。
            3.對變更請求產生的原因進行分析,像是由于在項目初期對需求沒有明確產生的項目變更,或是沒有明確項目范圍產生的變更,還是由于外部事件產生的變更。
            4.根據變更請求,分析變更對現有項目進度的影響程度,及變更之間的依賴關系。
            5.根據變更請求對現有項目進度的影響程度,確認相應的成本估計。
            6.對項目變更排列優先級。
            7.同項目贊助人協商項目變更影響,解決變更請求需要符合的條件以及相應的費用,并達到項目贊助人的可接受程度。最終確定是否實施變更。
            8.項目配置控制委員會批準相應的項目范圍變更,進度計劃,人員和費用計劃。
            9.將變更加入詳細計劃,更新相應文檔,通知相應項目干系人(變更的內容、進度、人員、費用)。
            10.執行并提交項目變更。
            11.在項目變更被接受后,終止變更請求。
            12.記錄實際項目變更所帶來的影響,汲取教訓。

          posted @ 2014-09-03 11:53 順其自然EVO 閱讀(178) | 評論 (0)編輯 收藏

          Jira和Confluence的權限管理

           背景:已經使用Jira和Confluence管理了一個產品團隊的任務和資源,現在又想加入另外一個產品團隊的任務和資源,首要問題是如何解決兩個團隊之間的權限隔離。研究了半天,閱讀了Jira和confluence的相關文檔,終于搞定,現在分享給大家。
            Jira
            打開系統管理中的權限模型我們可以看到現在有系統默認的權限模型和我自定義的兩個權限模型(建議自建權限模型時采用復制默認模型的方法然后進行更改)
            我們打開系統的默認權限模型可以看到系統默認的三種用戶組(管理員,開發者,普通用戶)
            我們可以打開tester的權限模型然后對相應權限應用的用戶組進行更改
            這些組和組成員的管理在用戶、組及角色中進行設置
            3.我們再把項目的權限模型改為需要的權限模型即可
          Confluence
            Confluence不同產品團隊間的資源權限可以利用“空間”的方式來做隔離,如下所示
            創建一個空間,標紅的地方本來是默認選中的,我們不選它們,以便之后的隔離權限。
            創建空間后管理員可以進入相應空間的空間管理界面進行權限設置,比如這里除管理員外我只給ibaby組用戶分配關于此產品空間的權限。
            這些組和組成員在站點管理的管理用戶中設置即可。
            這樣當某個用戶登錄后只會看到自己所屬組擁有權限的空間。
            一點小感想:我個人感覺Jira和Confluence不僅功能完善、流程清晰、易用性也好;更重要的是它的主旨是鼓勵團隊間的協作,千萬不要把它作為一個監控員工工作的工具。現在很多公司還在繼續采用限制監管員工的管理方式,采用這種自上而下的監管,不如接受自下而上的協作去推動工作。

          posted @ 2014-09-03 11:52 順其自然EVO 閱讀(1497) | 評論 (0)編輯 收藏

          僅列出標題
          共394頁: First 上一頁 53 54 55 56 57 58 59 60 61 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥化市| 如皋市| 大化| 西安市| 胶南市| 台中县| 方正县| 内乡县| 上虞市| 浦江县| 玉山县| 苍梧县| 巫山县| 涪陵区| 来安县| 郴州市| 云霄县| 安义县| 郧西县| 龙游县| 文登市| 博罗县| 嘉定区| 阿拉尔市| 锡林浩特市| 东丰县| 靖边县| 陆河县| 沙河市| 江油市| 德保县| 晋中市| 灵台县| 漠河县| 三台县| 哈密市| 三门峡市| 正安县| 门源| 五河县| 亳州市|