I see the truffle have 3 major ways of testing smart contract
1) Testing smart contract with solidity
2) Testing smart contract with javascript (without web3)
3) Testing smart contract with javascript (with web3)
What are the advantages and disadvantages of each and which to decide.